Home - 1990bingliu/https_create GitHub Wiki

Windown 下Nginx配置https服务器

使用 OpenSSL 制作一个包含 SAN(Subject Alternative Name)的,加密方式为sha256的证书 参考

  1. 安装OpenSSL
  • step.1 下载安装 Download OpenSSL,安装到C:\openssl-win
  • step.32 配置环境变量 新增变量名OPENSSL_HOME,变量值C:\openssl-win\bin;,打到Path变量,并在Path变量结尾添加一条: %OPENSSL_HOME%
  1. 配置openssl.cnf文件(如需要实现配置包多个域名的CSR,则该配置为必须的) *. 修改openssl.cnf
# dir目录为CA证的管理存放目录,该目录必须存在,且目录下应有:certs目录,crl目录,newcerts目录,
# private目录,及index.txt文件,serial文件(内容为00)
[ CA_default ]
dir= D:/CA	 Where everything is kept
certs		= $dir/certs		# Where the issued certs are kept
crl_dir		= $dir/crl		# Where the issued crl are kept
database	= $dir/index.txt	# database index file.
#unique_subject	= no			# Set to 'no' to allow creation of
					# several ctificates with same subject.
new_certs_dir	= $dir/newcerts		# default place for new certs.

certificate	= $dir/cacert.pem 	# The CA certificate
serial		= $dir/serial 		# The current serial number
crlnumber	= $dir/crlnumber	# the current crl number
					# must be commented out to leave a V1 CRL
# 确保req下存在以下2行(默认第一行是有的,第2行被注释了)
[ req ]
distinguished_name = req_distinguished_name
req_extensions = v3_req

# 确保req_distinguished_name下没有 0.xxx 的标签,有的话把0.xxx的0. 去掉
[ 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
organizationalUnitName             = Organizational Unit Name (eg, section)
organizationalUnitName_default = Domain Control Validated
commonName         = Internet Widgits Ltd
commonName_max = 64

# 新增最后一行内容 subjectAltName = @alt_names(前2行默认存在)
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

# 新增 alt_names,注意括号前后的空格,DNS.x 的数量可以自己加
[ alt_names ]
DNS.1 = abc.example.com
DNS.2 = dfe.example.org
DNS.3 = ex.abcexpale.net
DNS.4 = *.example.com
IP.1 = 192.168.8.222
IP.2 = 192.168.8.111
  • 创建CA证书管理目录
[root@localhost]#mkdir -p CA/{certs,crl,newcerts,private}
[root@localhost]# touch CA/index.txt
[root@localhost]#echo 00 > CA/serial

注意,CA的以上文件及目录是必须的,如没有,则自己创建,创建后,需要在openssl.cnf的 [ca_default] 下修改dir配置

  1. 生成CA自签署证书
  • step.0 进入目录d:\test_ssl
  • step.1 创建私钥
openssl genrsa -des3 -out ca.key 2048

输入密码后,再次重复输入确认密码。记住此密码,后面会用到。(注意:[-des3]指定后,该ca.key文件将加密存放,当需要使用该密钥,则需要输入密码方可使用。如需要明文存放该密钥(可用计事本直接打开查看),省略该选项即可。)

  • step.2 创建csr
openssl req -new -key ca.key -out ca.csr
提示出错:Unable to load config info from /usr/local/ssl/openssl.cnf 则在安装目录下找到share\openssl.cnf文件,在cmd中,输入 `set OPENSSL_CONF=C:\openssl-win\share\openssl.cnf` ,重新再输入生成csr证书指令.

注意Common Name <eg.YOUR name> []:localhost,需要与配置的服务器名ServerName一至,否则启动apache或nginx时会报错,其它可随意或不填写

openssl req -text -noout -in ca.csr查看csr文件

  • step.3 去除密码
在加载SSL支持的Nginx并使用上述私钥时除去必须的口令,否则会在启动nginx的时候需要输入密码。
复制ca.key并重命名为ca.key.org。
在命令行中执行如下命令以去除口令:
openssl rsa -in ca.key.org -out ca.key
然后输入密码,这个密码就是上文中在创建私钥的时候输入的密码。
  • step.4 生成自签root证书(默认是SHA-1加密的,这里用sha256,Chrome16年后已对SHA-1证书标记为“无效HTTPS”)
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -sha256 -out ca.crt

openssl x509 -text -noout -in ca.crt 查看crt文件

  1. 创建服务端SSL证书(带“使用者备用名称”的证书,即签署带有 SAN 扩展)
  • step.1 创建server.key
openssl genrsa -out server.key 2048
  • step.2 创建多域名的server.csr文件
openssl req -new -key server.key -out server.csr
  • step.3 创建server.crt,使用自签CA根证书签署带SAN扩展的SSL证书
openssl ca -in server.csr -md sha256 -out server.crt -cert ca.crt -keyfile ca.key -extensions v3_req -config "/etc/ssl/openssl.cnf"

输入两次y后,即可

  • 注意这里有坑 ** 创建csr文件时,信息必须写全 ** common name 视乎必须为域名格式,ip格式有的浏览器不承认 ** csr的信息需要与ca的证书信息相匹配(如地区、企业等,如需要设置成不匹配,则需要设置openssl.cnf链接
  1. 修改nginx conf
server {
    listen       443 ssl;
    server_name  localhost;

    ssl_certificate      d://test_ssl//server.crt;  # 这个是证书的crt文件所在目录
    ssl_certificate_key  d://test_ssl//server.key;  # 这个是证书key文件所在目录

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
      root   html;                  # 这个是指定一个项目所在目录
      index  index.html index.htm;  # 这个是指定首页的文件名
    }
}

SHA-256证书创建

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout ca.key -out ca.crt