近期忙着和第三方短信公司对接短信上行接口。给予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
client 浏览器需要使用的文件: ca.crt,client.crt,client.key,client.pfx
server 端使用的文件有: 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 部署已经完成。