本文基于Ubuntu 17 lts
一 SSL/TLS
SSL(Secure Sockets Layer),处于可靠点对点连接的网络层(如TCP)和应用层(如HTTP)之间的协议层.通过相互间的认证,数字签名,加密私有信息,提供客户和服务器之间的安全的通信.
版本如下
SSL建立会话有个握手流程,这个序列是可以变化的,取决服务器的配置,是否要求客户认证或服务器认证.
协商数据传输使用的密码算法
建立和共享会话密钥
证明来自服务器(可选)
证明来自客户(可选)
数据传输流程
MAC (Message Authentication Code)
(加密算法等请参考相关文档)
二 什么是RSA私钥,CSR
RSA私钥,是一个数字文件,用来解密发送给你的信息.他包含你通过证书签发给别人使用的公共部分,使别人能加密信息并发送给你.
CSR (Certificate Signing Request )是一个数字文件,包含你的公钥和名字.将他发送给一个认证机构,将其转换成一个签名的证书.
证书包含你的RSA公钥,你的名字,CA的名字,数字签名(用来验证并获得你的RSA公钥),用他来发送信息使你可以解密相关内容
三 创建自签名SSL认证
a 创建 .key ,.crt 文件
$ openssl req -new -x509 -nodes -out server.crt -keyout server.key
# 生成无密码的key和crt文件
这两个文件可以选定一个目录保存,后面要用
SSLCertificateFile “/path/to/this/server.crt”
SSLCertificateKeyFile “/path/to/this/server.key”
这个密钥文件没有被加密.给密钥文件加密用下面命令:
$ openssl rsa -des3 -in server.key -out server.key.new
$ mv server.key.new server.key
#备份好密钥文件,和密码,保存在安全的地方
四 创建一个真实的SSL认证
安装了openssl
创建rsa私有密钥(server.key)
$ openssl genrsa -des3 -out server.key 2048
$ openssl rsa -noout -text -in server.key #查看私钥内容
$ openssl rsa -in server.key -out server.key.unsecure #不加密的私钥
创建一个CSR(server.csr),输出为PEM格式
$ openssl req -new -key server.key -out server.csr
$ openssl req -noout -text -in server.csr #查看CSR内容
此处需要输入一些参数,其中Common Name ,应该是FQDN (“Fully Qualified Domain Name”)
比如https://www.foo.dom/, 需要输入"www.foo.dom"
然后发送CSR给认证机构,一旦有了签名证书就可用于Apache.你可以购买一个商业的,或自己创建一个签名证书.
如果你已经获取证书你可以查看
$ openssl x509 -noout -text -in server.crt
此时你只需要server.key,server.crt, 在相关配置中修改如下
SSLCertificateFile "/path/to/this/server.crt"
SSLCertificateKeyFile "/path/to/this/server.key"
而 server.csr不再需要.
五 创建自己的CA
其实也非常简单,命令如下
$ openssl genrsa -des3 -out server.key 2048 #生成密钥,密串
$ openssl req -new -x509 -nodes -sha1 -days 365 -key server.key -out server.crt -extensions usr_cert
#生成crt,并填写相关信息
七 Apache2 配置HTTPS验证
必备条件
$sudo apt-get install apache2
$sudo apt-get install openssl
$sudo a2enmod ssl #开启自带ssl模块
此命令相当于
sudo ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled
sudo ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled
如果没有a2enmod指令,也可直接在apache2.conf中设置SSL模块加载:
LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so
修改Apache2配置
/etc/apache2/port.conf 无需更改,默认支持443端口
/etc/apache2/sites-available/目录下生成一个缺省的default-ssl文件,做一个连接
ln -s /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled/001-ssl
使用openssl生成server.key,获得server.crt(参照前面的三,四,五步骤).
修改 /etc/apache2/sites-enabled/001-ssl,
SSLEngine on
SSLCertificateFile "/path/to/this/server.crt" #前面生成的key,crt文件这里要用
SSLCertificateKeyFile "/path/to/this/server.key"
重启服务即可
systemctl restart apache2
其他
修改密钥密码
$ openssl rsa -des3 -in server.key -out server.key.new
$ mv server.key.new server.key
去掉Apache启动时密钥对话框
$ cp server.key server.key.org
$ openssl rsa -in server.key.org -out server.key
$ chmod 400 server.key #保证只有ROOT可读
验证密钥是否与证书匹配
a 验证证书公钥和你私钥的公共分配,
$ openssl x509 -noout -text -in server.crt
$ openssl rsa -noout -text -in server.key
b ‘modulus’ 和 `public exponent’ 要匹配
$ openssl x509 -noout -modulus -in server.crt | openssl md5
$ openssl rsa -noout -modulus -in server.key | openssl md5
C 证书和密钥是否属于你
$ openssl req -noout -modulus -in server.csr | openssl md5
必须指出, 使用SSL后会增加系统负担.