本文重点讲解使用同一根证书,分别制作网站https的SSL证书、VSTO的代码签名证书,制作环境为安装了vs 2022的windows10、安装了openssl的centos7。
在windows10的环境下,在vs 2022 IDE中选择“工具-命令行-开发者Powershell”,进入命令行界面。
makecert -r -pe -n "CN=根证书名称" -b 08/08/2021 -e 08/08/2028 -sv ca.pvk ca.cer
弹出设置私钥保护口令提示框,选择None。
当前目录下生成的ca.cer即为自签名的根证书(含公钥),ca.pvk为根证书的私钥。
在Centos的环境下,新建目录,将刚刚制作的自签名根证书ca.pvk和ca.cer两个文件拷入,按以下步骤,生成ssl的子证书。
openssl genrsa -out server.key 2048
将openssl编译目录下apps目录中的openssl.cnf拷贝至当前目录,按以下要求修改配置。
#根据实际情况修改,将match改成optional,否则ca.cer必须与server.csr中的各个字段值一致才能签署
[ policy_match ]
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
# 确保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 = XX
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
localityName_default = Default City
organizationName = Organization Name (eg, company)
organizationName_default = Default Company Ltd
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (eg, your name or your server\'s hostname)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
#添加一行subjectAltName=@alt_names
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName=@alt_names
#新增alt_names,注意括号前后的空格,DNS.x 的数量可以自己加
#如果没有IP这一项,浏览器使用IP访问时验证无法通过
[ alt_names ]
IP.1 = 192.168.50.115
DNS.1 = dfe.leida.org
DNS.2 = ex.abcexpale.net
mkdir -p demoCA/newcerts
touch ./demoCA/index.txt ./demoCA/serial
echo "01">> ./demoCA/serial
openssl req -new -out server.csr -key server.key -config openssl.cnf
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.pvk -extensions v3_req -config openssl.cnf
当前目录下生成的server.crt即为https网站服务器的ssl证书,server.key为该服务器的私钥。
对/etc/nginx/conf.d/default.conf 文件添加如下代码,其中注意修改crt、key文件位置等关键项。
server {
listen 443 ssl;
server_name www.test.com;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server.key;
ssl_session_timeout 5m;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
重启nginx服务或服务器后,https网站将自动运行。
在windows10的环境下,在vs 2022 IDE中选择“工具-命令行-开发者Powershell”,进入命令行界面。
makecert -pe -n "CN=代码签名证书名称" -b 08/08/2021 -e 08/08/2028 -iv ca.pvk -ic ca.cer -sv child.pvk child.cer
pvk2pfx -pvk child.pvk -spc child.cer -pfx child.pfx
建立文件夹,将ca.cer、child.cer两个证书拷入,建立安装批处理文件cert.bat。运行VS 2022的计算机、浏览https网站和运行vsto的计算机,都要安装这两个证书。
CertMgr /add ca.cer /s /r localMachine root
certMgr /add child.cer /s /r localMachine trustedpublisher
1.windows7环境下,双击cert.bat批处理文件,直接安装两个证书。
2.windows10环境下,cert.bat批处理命令无效,应逐个安装证书,ca.cer安装到“受信任的根证书颁发机构”,child.cer安装到“受信任的发布者”。
VS 2022中,在项目上,点击右键,选择“属性”,在项目属性界面,选择“签名”中的“从文件选择”,选择提前编译好的证书文件,本例为“child.pfx”,点击“打开”后显示“child.pfx”证书的相关内容。