近期忙着和第三方短信公司对接短信上行接口。给予https和digest认证方式进行数据的传输。digest认证由前端phper进行实现,我需要完成nginx+ssl实现https服务。ssl使用openssl自己进行制作。
SSL原理:
给予SSL原理知识,在这里不再过多阐述。想详细了解,可以猛戳此链接进行查看:http://www.fenesky.com/blog/2014/07/19/how-https-works.html
1.首先要生成服务器的私钥:
运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法.),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施!
去除key文件口令的命令:
执行这个命令之后,再启动nginx时,就无需输入密码。
2. 用server.key生成一个证书
生成的csr 文件交给CA机构签名后,形成服务器自己的证书。按照提示,提供服务器证书的相关信息。
3. 对客户端也做同样的命令生成key及csr文件
4. 生成CSR证书文件必须有CA 机构的签名才可以形成证书。这里制作自己的CA生成一个key文件CA.key和一个根证书ca.crt
5. 创建openssl.conf 生成的配置文件
#根据openssl.cnf生成配置文件
touch /etc/pki/CA/{index.txt,serial}
#设置副本名称开始内容
echo 01 > /etc/pki/CA/serial
#设置副本证书存放目录
mkdir /etc/pki/CA/newcerts
6. 用CA的证书为刚才生成的server.csr 和 client.csr进行文件签名
客户端证书签发:
证书格式转换:
#IE浏览器需要p12证书,所以需要签发p12证书,用于IE签发:
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
#IOS 证书签发格式
openssl x509 -in client.crt -out client.cer
#Android 证书签发格式
openssl pkcs12 -export -in client.crt -inkey client.key -out client.pfx
#pem格式证书
openssl pkcs12 -export -in ddmdd_a.pfx -out client.pem
#删除私钥密码
openssl rsa -in client.key -out client_open.key
证书撤销:
echo 01 > crlnumber
openssl ca -keyfile ca.key -cert ca.crt -revoke client.crt #从CA中撤销证书client.crt
openssl ca -gencrl -keyfile ca.key -cert ca.crt -out client.crl #生成或更新撤销列表
查看证书信息:
openssl x509 -in client.pem -noout -text
ca.crt,client.crt,client.key,client.pfx
ca.crt, server.crt,server.key
7. 配置Nginx SSL
server {
listen 443 ssl;
server_name smsapi.chunbo.com;
root /var/www/smsapi.david.com;
ssl on;
ssl_certificate /etc/nginx/conf.d/server.crt;
ssl_certificate_key /etc/nginx/conf.d/server.key;
ssl_client_certificate /etc/nginx/conf.d/ca.crt;
ssl_verify_client off;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
index index.php index.html;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
if (-f $request_filename) {
fastcgi_pass 127.0.0.1:9000;
}
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
#nginx 配置完成,reloadNginx服务
8.客户端导入证书
证书安装及使用把刚才生成的证书: 根证书ca.crt和客户端client.crt(client.pfx)安装到客户端,ca.crt 安装到信任的机构,client.crt直接在windows 安装或安装到个人证书位置。(如果是IE浏览器,需要安装client.pfx证书,在导入的时候需要输入证书签发的密码)
9. 测试
接下来就可以通过浏览器进行测试。有的时候可能会作为一个API接口提供其它程序进行调用,比如我使用python requests进行调用:
import requests
responseObj = requests.get(' cert=('/path/client.crt', '/path/client.key' ) )
data = responseObj.text
或:
responseObj = requests.get(' verify='/path/client.pem')
data = responseObj.text
如果是JAVA程序,需要P12格式证书。根据自己的需求进行选择。
给予Nginx+openssl 部署已经完成。