使用OpenSSL自建CA证书

当今几乎所有的浏览器都推荐使用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;
    }
}
Captain QR Code

扫码联系船长

发表回复

您的电子邮箱地址不会被公开。