Ubuntu设置Grub2密码的方法

Grub是一个来自Gnu项目的启动引导程序,它是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。在Ubuntu系统中,很多用户都会给Grub2设置密码,但具体该怎么操作呢?(以下操作在Ubuntu 17.10中有效)

操作步骤:

leekwen@leekwen:~# grub-mkpasswd-pbkdf2

Enter password:    <<<这里输入你的grub密码
Reenter password:  <<<这里输入你的grub密码

Your PBKDF2 is grub.pbkdf2.sha512.10000.BCxxxxxxxxxxxxx45572D3B4E40500CE

leekwen@leekwen:~# vim /etc/grub.d/40_custom  <<<这是您应该放置自己的自定义设置的地方

在40_custom文件末尾添加如下两行:

set superusers="leekwen"
password_pbkdf2 leekwen grub.pbkdf2.sha512.10000.BCxxxxxxxxxxxxx45572D3B4E40500CE

第二行的格式为:password_pbkdf2 user1 EncryptedPasswordOfUser1

leekwen@leekwen:/etc/grub.d# update-grub  <<<运行此命令才可以生效

  Generating grub.cfg ...
  Found linux image: /boot/vmlinuz-3.11.0-15-generic
  Found initrd image: /boot/initrd.img-3.11.0-15-generic
  Found memtest86+ image: /memtest86+.bin
  done

这样重启后,在grub启动菜单,启动操作系统,编辑引导项,或进入命令行时,都会让你输入:

  username:
  password:

只有用户名(比如我刚刚设置的用户名为:leekwen)及密码正确后(刚刚用grub-mkpasswd-pbkdf2生成的密码),才可以进入启动项的编辑菜单,启动项这一步倒是安全了,记住,修改40_custom后一定要运行“update-grub”命令,这样才能生效!

以上就是Ubuntu中设置Grub2密码的方法,不清楚的用户可以参考上面介绍的操作步骤来设置密码,有需要的用户赶紧试试吧!

如何在Ubuntu系统中格式化优盘

2 种方法:

  • 使用磁盘实用程序
  • 使用终端

Ubuntu Linux系统中有多个实用程序,允许你对优盘进行格式化。你可以使用Ubuntu系统自带的磁盘实用程序,或使用终端格式化优盘。不论哪种方法,都可以在几分钟内完成格式化。

一、使用磁盘实用程序

未分类

1、点击Dash按钮,搜索“磁盘”。 在应用程序搜索结果中能看到“磁盘”程序。

未分类

2、从搜索结果中打开磁盘程序。左侧窗格中会出现已连接的设备列表。

未分类

3、从设备列表中选择优盘。它的详细情况会罗列在右侧面板中。

未分类

4、至少选中优盘上的一卷。大部分优盘上只有一卷,如果优盘上有很多卷,你可以选中一卷或全选。

未分类

5、点击右上方的齿轮按钮,选择“格式化”。 打开格式化选项。

未分类

6、选择你想要抹除的数据。快速格式化不会覆盖已存在的数据,而慢速格式化则会零覆盖已存在的数据,删除所有数据并查找错误。

未分类

7、选择文件类型。有多种不同的文件类型可供你选择。

  • 和其它设备兼容性最强的是“FAT”(FAT32)。它基本上适用于所有可使用优盘的电脑和设备。
  • 如果只想用于Linux电脑,请选择“ext3”。这允许你使用Linux高级文件权限。

未分类

8、格式化优盘。点击格式化按钮,等待优盘完成格式化。如果优盘上内容很多,需要抹除的数据很多,那么格式化需要花费一段时间。

二、使用终端

未分类

1、打开终端。可以从Dash上打开终端,或同时按下Ctrl+Alt+T组合键。

未分类

2、输入.lsblk ,按下 回车键。 接着会打开电脑已连接的存储设备列表。

未分类

3、找到优盘。使用 大小 一栏,在列表中找到优盘。

未分类

4、卸载优盘分区。你需要在格式化前卸载优盘。输入以下命令,按下优盘分区标签sdb1。

·sudo umount /dev/sdb1·

未分类

5、抹除设备上所有数据(可选)。你可以输入以下命令,删除所有数据。用优盘标签代替 sdb。

sudo dd if=/dev/zero of=/dev/sdb bs=4k && sync
这个过程会花费一点时间,并且可能出现卡顿现象。

未分类

6、创建一个新的分区表。这个分区表会控制驱动器上的卷。输入以下命令,用优盘标签代替 sdb。

输入·sudo fdisk /dev/sdb· ,按下回车键。按下O创建空白分区表。

未分类

7、按下.N 创建新分区。 输入你想要创建的分区大小。如果想要创建单独的分区,请输入整个优盘的大小。

未分类

8、按下.W 书写表格并退出。 这会花费一会时间。

未分类

9、再次运行.lsblk ,浏览新分区。 它会被列在游览标签的下方。

未分类

10、格式化新卷。此时已创建新卷,你可以将它格式化成选择的文件类型。输入以下命令,将它格式化成兼容性最强的FAT32文件系统。用分区标签代替sdb1。

sudo mkfs.vfat /dev/sdb1

未分类

11、完成后,安全弹出优盘。完成格式化后,安全弹出优盘:

sudo eject /dev/sdb

来源和引文

  • http://askubuntu.com/questions/198065/how-to-format-a-usb-drive
  • http://askubuntu.com/questions/22381/how-to-format-a-usb-flash-drive

Ubuntu下Aria2搭建下载机:Aria2图形管理

Aria2作为一款Linux下的下载神器,很多极客都在使用,可以下载http资源、种子文件、磁力链接等,功能强大,而且整合Chrome插件可以摆脱百度云盘的速度限制。

  • 高速,自动多线程下载;
  • 断点续传;
  • 轻量占用内存非常少,通常情况平均4~9MB内存占用(官方介绍);
  • 多平台。支援 Win/Linux/OSX/Android 等操作系统下的部署;
  • 模块化。分段下载引擎,文件整合速度快;
  • 支持RPC界面远程;
  • 全面支持BitTorrent协议;

Aria2官方项目页面:https://aria2.github.io/

下面介绍Aria2在Ubuntu的搭建方法

1. 搭建Aria2

wget https://github.com/aria2/aria2/releases/download/release-1.22.0/aria2-1.22.0.tar.gz
tar xzvf aria2-1.22.0.tar.gz
cd aria2-1.22.0
./configure
make
make install
man aria2c // 查看aria2c manual

2. 配置Aria2

创建配置文件 参考文档:https://aria2c.com/usage.html

mkdir /etc/aria2/
vim /etc/aria2/aria2.conf
直接进行下一步,不要填写,博主会提供一个配置文件下载
:wq!  //保存

下载博主配置好的conf文件:https://www.buguai.cc/wp-content/uploads/2017/07/aria2.zip

再使用SFTP客户端连接服务器,传到/etc/aria2 文件夹下替换即可。

3. 命令直接调用

直接在命令行下载

aria2c "download.url"

下载完成后自动退出,就和wget 的工作方式一样。

4. RPC Server模式(推荐)

aria2c --conf-path=

Aria2作为后台常驻程序,监测rpc端口的活动情况,添加并下载文件。完成后继续在后台运行。

涉及到命令输入,力求简化,第二种模式明显更省事。

5. 启动Aria2 RPC模式

命令行启动

aria2c --enable-rpc --rpc-listen-all --rpc-allow-origin-all -c  --dir /root/downloads -D (-D daemon模式,用于后台执行)
##开始监听RPC

命令行的模式无疑使用有些麻烦,而且SSH客户端不可能我们一直连接着,我们需要一个WebUI管理监测。

推荐两个:Aria2 Web UI或者YAAW。

Web UI是MD界面的,界面好看,但是因为未知原因博主未能成功使用,所以转而使用YAAW,YAAW相对更简单,基本功能都有,例如添加任务、设置下载目录、设置下载客户端UA、删除、暂停等。

未分类

6. webui-aria2

git clone https://github.com/ziahamza/webui-aria2

如果你不想搭建可使用https://ziahamza.github.io/webui-aria2/,配置数据是存在本地浏览器的,不需要注册。

注意:需要根据情况设置一下Aria2 RPC的地址,一般为Aria2后台进程运行的ip:port,例如192.168.119.100:6800。

YAAW

git clone https://github.com/binux/yaaw

YAAW也有线版本

https://aria2c.com/
https://binux.github.io/yaaw/demo/

注意:需要根据情况设置一下Aria2 RPC的地址,一般为Aria2后台进程运行的ip:port,例如192.168.119.100:6800。

其他版本:方便我们使用Aria2

7. Windows下图形版本

Aria2c Remote Control

https://sourceforge.net/projects/aria2cremote/

8. 给jsonrpc加上验证

使用token验证(建议使用)
需要1.18.4以上版本,帐号密码方式将在后续版本中停用!

配置文件

# token验证
rpc-secret=secret

命令行

使用--rpc-secret=xxxxxx选项

启用验证后,使用https://token:secret@hostname:port/jsonrpc的地址格式设置secret。

使用密码验证

需要1.15.2以上,1.18.6以下版本
1.18.4新增了--rpc-secret ,设置的RPC授权令牌, 取代--rpc-user--rpc-passwd选项

配置文件

#用户名
rpc-user=username
#密码
rpc-passwd=passwd

命令行

使用 --rpc-user=user --rpc-passwd=pwd 选项

启用验证后,使用https://username:passwd@hostname:port/jsonrpc的地址格式设置密码。

对于RPC模式来说, 界面和后端是分离的, 只要给后端设置密码即可. 前端认证什么的是毫无意义的。

9. 其它相关

YAAW搭配脚本

迅雷离线(需会员账号)

Chrome Extension: ThunderLixianAssistant
UserScript: ThunderLixianExporter

旋风离线

UserScript: XuanFengEx
UserScript: LixianExporter

百度网盘

Chrome Extension: BaiduExporter
Firefox Addons: BaiduExporter
UserScript: BaiduPanDownloadHelper

115网盘

Chrome Extension: 115exporter

其他脚本

Chrome Extension

添加到aria2

Chrome Download Helper

在阿里云上Ubuntu环境通过nginx+uwsgi部署Django项目

年前阿里云打折,1核1G的云服务器一年只要300多块,果断就租了1年的。既然服务器已经到手,怎么能不把自己写的项目部署上去呢,其实网上关于nginx+uwsgi部署Django项目的文章有很多,但是这些文章要不就是很久之前的,要不就是互相抄袭,一路过来都是坑,这里重点吧在部署时候遇到的坑着重介绍一下:

1. 首先部署django项目

首先是django项目,由于我是使用Anaconda来进行版本控制的,而django项目是在Python2.7环境下开发的,首先是新建一个Python2.7的环境:

#创建python27环境
conda create --name python27 python=2.7
#激活该环境
source activate python27
#通过conda安装django
conda install django

环境准备好后,从GitHub上将项目拉取下来

git clone https://github.com/sunny0826/xxx

修改setting.py文件

#debug模式默认开启,这里要关闭
DEBUG = False
#这里将外网IP配置进来
ALLOWED_HOSTS = ['127.0.0.1','xx.xx.xx.xx']

启动项目:

#来项目目录下执行
python manage.py runserver 8000

然后在外网ip:8000路径下查看项目启动情况

2. 阿里云配置安全组

由于是服务器在阿里云上,所以直接访问时访问不到的,所以要在阿里云平台配置安全组(类似于防火墙)

首先打开阿里云平台,登录,点击安全组配置:

未分类

点击配置规则

未分类

点击添加安全组规则

未分类

按要求填写安全组规则

未分类

优先级1位最高优先级,端口可以设置范围,并且可以设置授权访问的对象
设置完之后,就可以在公网IP访问到我们的django项目了

3. 安装配置uwsgi

确定django项目可以正常运行了,ctrl+c停止项目,下面我们来安装uwsgi:
在安装uwsgi非常简单,只需要pip安装即可,但是由于之前使用的是Python27环境,这里记得要激活Python27环境,否则就安装到默认的Python路径了

#uWSGI 是一个(巨大的) C 应用,所以你需要一个 C 编译器(比如 gcc 或者 clang)和 Python 开发版头文件
apt-get install build-essential python-dev
#安装uwsgi
pip install uwsgi

按照官网介绍,写已经Python脚本进行测试,test.py(在任意路径都可以,不过测完要记得删掉)

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World"]

然后输入命令进行测试

uwsgi --http :8000 --wsgi-file test.py

这里是8000端口,因为之前测试django的时候打开的8000端口,这里偷懒就不去配置新的安全组了
那么问题就来了,在启动的时候报错了….=。=

未分类

出现的这个错误,经过测试只会在Python2.7的环境发生,在Python3+就没有发生了,辗转百度和Google,都没有找到这个问题的解决办法且这个问题一般发生在nginx上…
但这个报错问题还是很明显,就是libpcre.so.1这个文件找不到,初步推测为版本问题
首先要咱们搜索一下这个文件,看看本机有没有

未分类

发现本机是有这个文件的,那就好办了,将他链接到相应位置就好

未分类

执行这条语句之后就可以uwsgi就可以正常启动了

在跳过这个坑之后,就可以正式来配置我们的项目了
首先修改自己项目中的wsgi.py文件,添加两行代码

未分类

然后在django项目根目录创建uwsgi.ini文件

uwsgi.ini文件配置

# uwsgi.ini file
[uwsgi]

# Django-related settings

socket = 127.0.0.1:8000            #与nginx通信的地址和端口

# the base directory (full path)
chdir           = /apps/xxxx        #django项目绝对路径

# Django s wsgi file
module          = xxxx.wsgi    #wsgi文件所在的相对于项目的路径

# the virtualenv (full path)
home            =  /root/anaconda3/envs/python27/lib/python2.7/site-packages        #python环境的路径

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

plugins=python
#log文件
daemonize=/apps/uwsgi/uwsgi.log
#pid文件
pidfile=/apps/uwsgi/uwsgi.pid

这里配置日志文件和pid文件,方便之后的重启

关于uwsgi的重启问题:

每次项目有代码更新的话,都需要重启uwsgi,如果没有配置pid文件的话,重启需要使用:

#查看uwsgi进程号
ps aux | grep uwsgi
#关闭进程号为0的进程
kill -9 主进程号

未分类

来停止uwsgi,然后才能重启,注意这里的主进程是pid为1的进程,而配置了pid文件的,只需要进行如下方法来重启即可

#重载(一般修改参数,或者修改py文件经常用到)
uwsgi --reload uwsgi.pid
#重启(一般系统环境变化会用到)
uwsgi --stop uwsgi.pid

最后在项目根目录下运行uwsgi命令,载入配置文件

uwsgi --ini uwsgi.ini

然后在后面的日志中要注意环境是否为之前配置,如果不是请激活激活之前创建的Python环境再进行操作

4. 安装配置nginx

最后来安装nginx

sudo apt-get install nginx

修改nginx配置

cd /etc/nginx/sites-enabled    #Ubuntu中nginx配置文件所在路径
vim default

配置文件

server {
        listen 80 default_server;            #监听端口,将来访问的端口
        listen [::]:80 default_server;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;


        server_name _;

        location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:8000;    #uwsgi中配置的路径
        }

        location /static {
                alias /apps/xxx/static;       #静态资源路径
        }

        location /resume.ico  {
                alias /apps/xxx/static/resume.ico;    #网页图标路径
        }
}

uwsgi启动后,再启动nginx

基础命令

/etc/init.d/nginx start  #启动
/etc/init.d/nginx stop  #关闭
/etc/init.d/nginx restart  #重启

启动之后,访问外网IP:80,查看是否可以通过nginx访问django

Debian/Ubuntu修改crontab默认编辑器

之前在一台vps上使用crontab -e来编辑定时任务,一般默认都是nano编辑器,但是那台小鸡的nano编辑器不好使怎样都没法保存,只要将默认编辑器修改为vim后解决。记录一下Debian和Ubuntu修改默认编辑器的方法。

Debian下先安装好vim编辑器,apt-get install vim,然后输入

update-alternatives --config editor

我这里出现了好几个,然后我选择的是7,/usr/bin/vim.basic也就是vim基本编辑

root@vps:~# update-alternatives --config editor
There are 8 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/joe         70        auto mode
  1            /bin/nano            40        manual mode
  2            /usr/bin/jmacs       50        manual mode
  3            /usr/bin/joe         70        manual mode
  4            /usr/bin/jpico       50        manual mode
  5            /usr/bin/jstar       50        manual mode
  6            /usr/bin/rjoe        25        manual mode
  7            /usr/bin/vim.basic   30        manual mode
  8            /usr/bin/vim.tiny    10        manual mode

Ubuntu下只要运行select-editor即可选择默认编辑器

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny

这里我就选择了3,使用vim基本模式,正常编辑。

解决新装 ubuntu 无法运行 ansible 的问题

尽管用 CentOS 的人多,但我是推崇 Ubuntu Server,简洁易用,包管理可靠稳健。

但是,用 ubuntu server xenial 或以上的版本,就会遇到一个新装的系统,无法执行 ansible 的问题。因为 ubuntu xenial 以上版本已经默认使用 python3 了。通常的解决方法就是安装 python-minimal 包。

最近设计一套 ansible 脚本时,预设的环境是离线内网集群,那么如何解决这个问题呢?我编写了一个初始化 playbook 代码。

以下我的 hosts 内容,ubuntu_hosts是空的:

[servers]
centos7 ansible_host=192.168.1.146 ansible_ssh_port=22
ubuntu16 ansible_host=192.168.3.231 ansible_ssh_port=22

[ubuntu_hosts]

以下我的 playbook 内容:

- hosts: all
  become: yes
  gather_facts: no
  tasks:
    - include_role:
        name: init
        tasks_from: check_python.yml

- hosts: all
  become: yes
  roles:
    - init

我们来看看 init 里的 check_python.yml 做了什么动作:

- block:
    - name: testing python2
      raw: test -e /usr/bin/python
      when: ansible_python_interpreter is not defined
  rescue:
    - name: testing python3
      raw: test -e /usr/bin/python3
    - name: set python3 as default python command
      lineinfile:
        path: hosts
        line: '{{ inventory_hostname }} ansible_python_interpreter=/usr/bin/python3'
        insertafter: '[ubuntu_hosts]'
      delegate_to: localhost
      become: no
    - meta: clear_host_errors
    - meta: refresh_inventory
  1. 首先检查是否有 python 命令。

  2. 如果检查失败,那么执行 resuce 部分的 tasks,把这台机器写入到 hosts 文件里,指定使用 python3 作为交互命令。

  3. 清除错误,刷新 inventory 列表。为之后的动作扫清障碍。

这样我们就得到了一个新的 hosts 列表:

[servers]
centos7 ansible_host=192.168.1.146 ansible_ssh_port=22
ubuntu16 ansible_host=192.168.3.231 ansible_ssh_port=22

[ubuntu_hosts]
ubuntu16 ansible_python_interpreter=/usr/bin/python3

以下是输出截图

未分类

原本我是用了个偷懒的方法,直接在 Ubuntu Xenial 上建一个软链 /usr/bin/python 指向 /usr/bin/python3 的,也能解决 ansible 的执行问题。但考虑到这样可能会给以后运行其它 python 应用挖坑,所以还是稍微折腾一下,确保我们不改动系统级别的命令工具。

宝塔部署ubuntu+nginx+flask环境

准备

  1. 搭建好宝塔的vps,我用的是vultr
  2. flask应用在本地运行成功

在宝塔界面添加网站

  1. 设置好域名,数据库,php版本不管,或者在软件管理中卸载php
  2. 创建的web文件在/www/wwwroot/目录下
  3. 在本地的flask应用文件打包上传到刚刚创建的web文件中,解压

创建Python环境

$ sudo apt install python3-venv
$ python3 -m venv venv
# 如果venv/bin/下没有activate,就表示没有成功,解决如下
$ export LC_ALL="en_US.UTF-8"
$ export LC_CTYPE="en_US.UTF-8"
$ sudo dpkg-reconfigure locales
# 进入虚拟环境
$ source venv/bin/activate
# 安装uWSGI和requirements
$ pip install uwsgi
$ pip install -r requirements.txt
# 退出虚拟环境
$ deactivate

配置uwsgi

在应用根目录创建config.ini文件,内容如下

[uwsgi]
# uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:8386
# 指向网站目录
chdir = /www/wwwroot/www.itswcg.site
# python 启动程序文件
wsgi-file = main.py
# python 程序内用以启动的 application 变量名
callable = app 
# 处理器数
processes = 4
# 线程数
threads = 2
#状态检测地址
stats = 127.0.0.1:9191

配置nginx

在宝塔面板中,管理网站,设置,配置文件修改如下,
或者在/www/server/panel/vhost/nginx/.conf下修改

server {
  listen  80; 如有多个web应用,都是80端口监听
  server_name resume.itswcg.com; #地址
  location / {
    include      uwsgi_params;
    uwsgi_pass   127.0.0.1:8386;  # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理
    uwsgi_param UWSGI_PYHOME /www/wwwroot/www.itswcg.site/venv; # 指向虚拟环境目录
    uwsgi_param UWSGI_CHDIR  /www/wwwroot/www.itswcg.site; # 指向网站根目录
    uwsgi_param UWSGI_SCRIPT main:app; # 指定启动程序
  }
}

重启

$ sudo service nginx restart

这时候运行如下,不出错,输入网址就成功了

$ uwsgi config.ini

配置supervisor

supervisor能同时启动多个应用,能自动重启应用,保证可用性。
安装

$ sudo apt-get install supervisor

在/etc/supervisor/conf.d下添加.conf文件(resume.conf),内容如下

[program:resume] #resume是<name>
##注意项目目录和uwsgi的配置文件地址
command=/www/wwwroot/www.itswcg.site/venv/bin/uwsgi /www/wwwroot/www.itswcg.site/config.ini
directory=/www/wwwroot/www.itswcg.site
autostart=true
autorestart=true
user = root
##log文件的位置
stdout_logfile=/www/wwwroot/www.itswcg.site/logs/uwsgi_supervisor.log

启动

supervisord -c /etc/supervisor/supervisord.conf

客户端管理

$ supervisorctl

这样你就不用每次重启时都运行$ uwsgi config.ini,supervisor帮你自动重启

还有别忘了在宝塔面板安全中,放行端口

未分类

Let’s Encrypt配置免费SSL证书建立HTTPS(Ubuntu+Apache)

前言

这段时间在开发微信小程序,需要一个后台服务器,KP小站刚好能够派上用上。不过,微信规定必须使用HTTPS链接,于是按照DigitalOcean的官方教程,利用Let’s Encrypt配置免费SSL简书。过程还是很简单的,虽然遇到了一个小问题,不过Google后也顺利解决了,这里简单分享下心得。

一. 什么是HTTPS?

  1. HTTP表示超文本传输协议(HyperText Transfer Protocol),用来传输客户端(浏览器)和WEB服务器之间的内容。当你访问kplayer.me时,服务器就把html,css,js以及图像等文件通过该协议传输到你的浏览器,你的浏览器解析后就展现主页的内容。

  2. 但是HTTP协议有个问题就是它是明文的,这样就存在安全隐患,如传输内容会被偷窥和窃取;另外在HTTP中通信双方的身份没有进行验证,可能会出现伪装身份的情况,由于任何人都能对服务器发起请求,也使服务器易受DOS攻击;最后客户端无法确定接受报文的完整性,因为中途可能被篡改。

  3. 那么HTTPS呢?它表示HTTP over SSL,其中的S表示SSL:Secure Socket Layer,中文叫“安全套接层”。SSL利用数据加密技术,防止数据在网络传输过程中不会被截取及窃听。它最早为网景公司Netscape所研发,在IETF(国际互联网工程任务组)进行标准化后改名为 TLS(Transport Layer Security),中文叫做“传输层安全协议”,现在我们常能看到二者的合称SSL/TLS。

  4. HTTPS的具体原理是什么?

理解原理之前需要简单介绍几个相关的概念。

4.1 对称密钥和非对称密钥

对称密钥就是客户端和服务器都拥有一把相同的钥匙,用来对报文加解密。打个比方,我有个机密文件想要传给你,但又怕中间被人窃取了,所以我用WinRAR进行口令加密压缩,然后传输给你,你收到文件时输入口令解压即可,这就是对称密钥/口令。但是我怎么安全的告诉你口令是什么呢?至少第一次肯定需要传输口令,这似乎又回到了安全传输的困境,如果这个口令不能安全的传递给你,在过程中被窃取了,那么这种加密方式又有什么意义?

非对称密钥就是加解密使用不同的密钥。那怎么用呢?首先我作为服务器在本地生成一对密钥,一个是公有密钥,一个是私有密钥。我把公有密钥告诉你,你用来进行对文件加密传输,我收到文件后用我的私有密钥进行解密,获得最终文件。相比对称密钥,不必担心密钥的安全传输问题,因为即使公钥被截获,也无法被解密。

4.2 数字摘要与数字签名

有了非对称密钥,有助于客户端和服务端之间的数据不被偷窥和窃取。但是这似乎并不能防止传输的数据被篡改(对于客户端来说),另外如何保证数据是真实服务器发送的而不是被调包过的呢?于是,数字摘要和数字签名技术就被引入了。a) 服务器采用Hash函数对报文生成“摘要”;b) 服务器再用私钥对这个摘要进行加密,作为“数字签名”连同报文发给客户端;c) 客户端收到后,提取数字签名用服务器的公钥进行解密,如果能得到摘要,那说明是真实服务器发送的;d) 客户端再对接收的报文采用与服务器相同的Hash函数处理得到本地摘要,如果与刚刚解密出来的摘要完全一致,那说明报文没有被篡改过。

未分类

4.3 数字证书

有了数字签名,似乎安全性已经得到了保证。真的是这样么?任何存在不可信任风险的地方都有可能被利用。在数字签名中,客户端收到报文后需要用服务器的公钥进行解密,那么如果有不法者偷偷替换了服务器公钥为自己的公钥呢?那么该不法者就可以用自己的私钥生成数字签名发送报文给客户端。因此最大的问题就在于:对于客户端来说,如何确保它所得到的公钥一定是从目标服务器那里发布的,而且没有被篡改过呢?这时候就需要一个权威的第三方机构来统一对外发放公钥,就是所谓的证书权威机构(Certificate Authority, CA),由服务器管理者向CA申请,认证后CA会给服务器管理者颁发“数字证书”(含主机机构名称、公钥等文件),于是服务器在之后发送报文给客户端时只需要加上数字证书即可,客户用CA的公钥验证后就可确认来源的可靠性。

4.4 HTTPS

了解了以上的内容,现在我们来了解下HTTPS的流程:

未分类

a. 客户端使用HTTPS的URL链接向服务器发起请求,如https://kplayer.me;

b. WEB服务器收到请求后将网站的证书信息(含公钥等)发送给客户端;

c. 客户端根据“证书管理器”判断证书是否被冒用,或者公钥是否有效,有问题则发出警告;

d. 如果证书和公钥有效,则客户端首先生成一个随机(对称)数串,并生成客户端版的共享密钥;

e. 客户端再用公钥对数串进行对称密钥加密,之后发送给服务器;

f. 服务器收到这个加密后的随机数串,只需要用私有密钥就能解密出该随机数串;

g. 服务器以随机数串生成服务器端的共享密钥;

h. 至此,客户端和服务端拥有相同共享密钥,则可以利用共享密钥进行安全通信。

从以上流程可以看出HTTPS采用HTTP+SSL的方式使得网站的访问更加安全,但它也使得通信信息量增加,速率降低,消耗更多的服务器资源,而且向认证机构购买证书也是一笔开销,因此在HTTP和HTTPS的选择上要视网站的功能和需求而定。

二、Let’s Encrypt是什么?

SSL证书按大类一般可分为DV SSL、OV SSL、EV SSL证书,也叫做域名型、企业型、增强型证书。

域名型SSL证书(DV SSL):信任等级普通,只需验证网站的真实性便可颁发证书保护网站;

企业型SSL证书(OV SSL):信任等级强,须要验证企业的身份,审核严格,安全性更高;

增强型SSL证书(EV SSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高,同时可以激活绿色网址栏。

对于个人博客和站点,申请个免费的DV型SSL证书最划算。Let’s Encrypt 是一个免费、开放,自动化的证书颁发机构,由 ISRG(Internet Security Research Group)运作。

https://letsencrypt.org/

ISRG 是一个关注网络安全的公益组织,其赞助商从非商业组织到财富100强公司都有,包括 Mozilla、Akamai、Cisco、Facebook,密歇根大学等等。ISRG 以消除资金,技术领域的障碍,全面推进加密连接成为互联网标配为自己的使命。

三、如何使用Let’s Encrypt配置SSL证书?

官方教程在此:

https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04

1. 安装Let’s Encrypt客户端

a) 新增软件包目录:

sudo add-apt-repository ppa:certbot/certbot

并按回车ENTER确认

b) 更新新增的目录信息

sudo apt-get update

c) 安装官方客户端Cerbot

sudo apt-get install python-certbot-apache

2. 配置SSL证书

sudo certbot –apache -d kplayer.me

根据提示输入对应指令即可,过程中会要求提供Email用于丢失密钥恢复和相关通知,也会让你选择同时启用http和https访问,或者强制所有请求重定向到https。

另外,如果想要证书对对多个域名或子域名有效,可以增加参数,如下(建议第一个是主域名):

sudo certbot –apache -d kplayer.me -d http://www.kplayer.me

如果有多个域名的话,可以多次调用cerbot命令。

安装完成后,可以在浏览器输入以下地址,确认是否成功:

https://www.ssllabs.com/ssltest/analyze.html?d=kplayer.me&latest

成功的话,就可以使用https://kplayer.me来访问小站啦。

不过KP君在执行时收到如下报错信息:

Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.

一阵Google后,原来由于安全问题,Let’s Encrypt已经停止提供Certbot的Apache和Nginx插件所用的机制,计划在接下来的日子里发布一个新版本的Certbot,如果急需要用的话,可以采用临时的方法:

sudo certbot –authenticator standalone –installer apache -d kplayer.me –pre-hook "systemctl stop apache2" –post-hook "systemctl start apache2"

详情参见:https://github.com/certbot/certbot/issues/5405

3. 验证Certbot自动更新

Let’s Encryp只提供加密90天的证书。然而,我们安装的certbot软件包通过一个systemd定时器每天运行两次certbot进行更新。在非systemd发行版中,此功能由位于/etc/cron.d中的cron脚本提供。 该任务每天运行两次,并将在续期30天内更新。

可以通过如下命令验证:

sudo certbot renew –dry-run

如果没有报错,那就大功告成。如有必要,Certbot将更新证书并重新加载Apache。如果自动更新失败,Let’s Encrypt将向我们提供的电子邮件发送一封邮件,并在证书即将到期时发出警告。

后记

配置完HTTPS,兴奋地在微信小程序后台提交网址,结果提示需要域名备案。在我纠结了一天后,决心乖乖接受监督,可惜在备案的过程中告诉我.me域名暂时无法备案,欲哭无泪,那我就好好的用来写我的博客吧。

注:以上文字和图片部分整理自网络。

Ubuntu通过apt-get安装指定版本和查询指定软件有多少个版本

一、通过apt-get安装指定版本

apt-get install <<package name>>=<<version>>

二、查询指定软件有多少个版本

说明:在Linux用这个查询并不能完全的把所有版本都列举出来,因为每个版本都与系统版本和CPU架构有关,比如一个软件支持Ubuntu系统的16.04的CPU架构为amd64的版本只有1.0和1.2,其余都不支持,所以列举时就只有两款。

列举版本列表

0、通过网站搜索:

https://packages.ubuntu.com/

1、

apt-cache madison <<package name>>

将列出所有来源的版本。如下输出所示:

apt-cache madison vim
   vim | 2:7.3.547-1 | http://debian.mirrors.tds.net/debian/ unstable/main amd64 Packages
   vim | 2:7.3.429-2 | http://debian.mirrors.tds.net/debian/ testing/main amd64 Packages
   vim | 2:7.3.429-2 | http://http.us.debian.org/debian/ testing/main amd64 Packages
   vim | 2:7.3.429-2 | http://debian.mirrors.tds.net/debian/ testing/main Sources
   vim | 2:7.3.547-1 | http://debian.mirrors.tds.net/debian/ unstable/main Sources

madison是一个apt-cache子命令,可以通过man apt-cache查询更多用法。

2、

apt-cache policy <<package name>>

将列出所有来源的版本。信息会比上面详细一点,如下输出所示:

apt-cache policy gdb
gdb:
  Installed: 7.7.1-0ubuntu5~14.04.2
  Candidate: 7.7.1-0ubuntu5~14.04.2
  Version table:
 *** 7.7.1-0ubuntu5~14.04.2 0
        500 http://fr.archive.ubuntu.com/ubuntu/ trusty-updates/main amd64 Packages
        100 /var/lib/dpkg/status
     7.7-0ubuntu3 0
        500 http://fr.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
        500 http://archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

policy是一个apt-cache子命令,可以通过man apt-cache查询更多用法。

3、

apt-cache showpkg <<package name>>

4、

apt-get install -s <<package-name>>

说明:这个命令只是模拟安装时会安装哪些软件列表,但不会例举出每个软件有多少个版本

5、

aptitude versions <<package name>>

参考:https://manpages.debian.org/unstable/aptitude/aptitude.8.en.html

6、

apt-show-versions -a <<package name>>

说明:列举出所有版本,且能查看是否已经安装。还可以通过apt-show-versions -u <>来查询是否有升级版本。

参考:http://manpages.ubuntu.com/manpages/trusty/man1/apt-show-versions.1p.html

7、

whohas -d Debian,Ubuntu <<package name>> | tr -s ' ' 't' | cut -f 1-3 | column -t

8、

rmadison -u debian,ubuntu,bpo <<package name>> | cut -d "|" -f 1-3

单个详情

1、

apt-cache show <<package name>>

说明:查询指定包的详情,不管是否已经安装。

2、

dpkg -l <<package name>>

说明:效果和上面基本一致,但是结果是列表详情展示,会提示是否已经删除了之后还有依赖包没有删除等。

3、

dpkg -s <<package name>>

说明:必须是安装的包才能显示详情。

4、

dpkg-query -s <<package name>>

说明:同上,效果一致。

使用技巧

1、可以在查询后面带上一些参数来实现筛选

apt-cache show package | grep Version
apt-show-versions | more

Ubuntu 16.04 下通过 apt 安装 ActiveMQ

  • 更新系统软件包
sudo apt update 
sudo apt upgrade
  • 安装 jdk
sudo apt install default-jdk
  • 安装、启动 ActiveMQ
sudo apt install activemq
sudo systemctl start activemq
  • 查看
sudo systemctl status activemq
netstat -nl|grep 61616

说明:截止到2018-01-26 这种方式都还是有问题的【active (exited)】,已有人提交 bug report。

  • Web 管理页:http://127.0.0.1:8161/admin/

  • 服务状态说明

loaded              # 系统服务已经初始化完成,加载过配置
active(running)     # 正有一个或多个程序正在系统中执行,守护进程 activemq 就应该是这种模式
atcive(exited)      # 仅执行一次就正常结束的服务,如 iptables
atcive(waiting)     # 正在执行中,不过还再等待其他的事件才能继续处理
inactive            # 服务关闭
enbaled             # 服务开机启动
disabled            # 服务开机不自启
static              # 服务开机启动项不可被管理
failed              # 系统配置错误