当今几乎所有的浏览器都推荐使用HTTPS协议,苹果APP和安卓APP也逐渐会淘汰掉使用未加密的HTTP网络访问。因此使用HTTPS作为网络服务协议势在必行。当我们上线WEB服务以后,我们可以根据实际需求申请不同类型的SSL证书(CA有免费版本,也有收费版本,具体可以参考本文了解SSL证书的却别)。如果在开发过程中没有SSL安全证书,但是在APP中又要使用HTTPS协议,我们可以选择使用OpenSSL自建一张SSL证书,待服务上线以后在使用第三方发布的证书。
由于百度上搜索的结果有90%的重复性,另外90%的内容是无法实现的。最后东拼西凑搞定了一个可以使用的版本,因此本文也不算是完全的原创,只为方便日后使用,遂记录下来。
准备机构配置信息
保存一下配置信息并保存文件openssl.cnf。
[ req ] default_bits = 4096 distinguished_name = req_distinguished_name req_extensions = req_ext [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = CN stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = ShangHai localityName = Locality Name (eg, city) localityName_default = ShangHai organizationName = Organization Name (eg, company) organizationName_default = Alibaba commonName = localhost (e.g. server FQDN or YOUR name) commonName_max = 64 commonName_default = localhost [ req_ext ] subjectAltName = @alt_names [alt_names] DNS.1 = jmsliu.cn DNS.2 = localhost IP.1 = 127.0.0.1 IP.2 = 101.132.238.47
这里需要注意的是alt_names配置项下的内容。如果我没有理解错的话,应该是最终证书提供服务的域名和IP地址。
生成终端用户证书
生成终端用户证书的过程比较简单,有三个步骤。
#1. 生成证书密钥ca.key
openssl genrsa -out ca.key 4096
#2. 生成证书签发请求ca.csr
openssl req -new -sha256 -out ca.csr -key ca.key -config openssl.cnf
#3. 生成SSL证书ca.crt
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt -extensions req_ext -extfile openssl.cnf
生成服务器端证书
生成服务器端证书证书也是3个步骤,但是需要上面步骤中设计的文件。
#1. 生成服务器证书密钥server.key
openssl genrsa -out server.key 2048
#2. 生成服务器证书签发请求server.csr
openssl req -new -sha256 -out server.csr -key server.key -config openssl.cnf
#3. 生成服务器证书server.crt
openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt -extensions req_ext -extfile openssl.cnf
配置服务器端证书
配置SSL证书的方法根据不同的服务器各有不同。本文只给出最简单的用于零时开发使用的Nginx配置方案:
server { listen 18333; server_name 101.132.238.47; ssl on; ssl_certificate server.crt; ssl_certificate_key server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /www/html; try_files $uri $uri/ /index.html; index index.html index.htm; } }

扫码联系船长