# 使用OpenSSL自签发SSL证书,支持chrome识别

# 1. 创建根证书

# 创建生成本地根证书的目录
mkdir /data/soft/ssl && cd /data/soft/ssl

# 生成根密钥
openssl genrsa -out boot.key 2048

# 生成根CA证书:-days 选项指定时间(单位:天)
openssl req -x509 -new -key boot.key -out boot.pem -days 3650
1
2
3
4
5
6
7
8

生成完成后,将根证书文件 boot.pem 导入到浏览器和系统中
mac 的 chrome 设置方式为: 打开chrome浏览器的 “设置”选项 => "隐私和安全" => "安全" => "管理证书", 在打开的对话框中 选择 “系统” => "证书", 将下载的 boot.pem 拖入该界面中,双击刚拖入的该文件,在弹出框中点击 “信任”,在“使用此证书时:”的下拉选项中选择“始终信任”。

# 2. 颁发应用证书

# (1). 创建应用证书请求

# 生成应用证书的密钥
openssl genrsa -out app.key 2048

# 生成证书颁发请求
openssl req -new -key  app.key -out app.csr
1
2
3
4
5

# (2). 创建证书附加用途文件

用于解决Chrome不能识别证书通用名称NET::ERR_CERT_COMMON_NAME_INVALID错误,签发基于IP地址证书和基于域名的证书的使用的文件格式不一样:

# 1). 基于IP地址的证书
vi app.ext
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName

[ SubjectAlternativeName ]
IP.1=192.168.1.1
IP.2=192.168.1.2
1
2
3
4
5
6
7
8
# 2). 基于域名的证书(可以使用通配符"*")
vi app.ext
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName

[ SubjectAlternativeName ]
DNS.1=app.com
DNS.2=*.app.com
DNS.3=test.com
DNS.4=*.test.com
1
2
3
4
5
6
7
8
9
10

extendedKeyUsage 可以指定证书目的,即用途,一般有: serverAuth:保证远程计算机的身份 clientAuth:向远程计算机证明你的身份 codeSigning:确保软件来自软件发布者,保护软件在发行后不被更改 emailProtection:保护电子邮件消息 timeStamping:允许用当前时间签名数据 如果不指定,则默认为 所有应用程序策略

# 3. 签发证书

openssl x509 -req -in app.csr -CA boot.pem -CAkey boot.key -CAcreateserial -out app.crt -days 3650 -sha256 -extfile app.ext
1

# 4. 部署应用证书

将当前目录生成的应用证书app.crt和应用证书密钥app.key上传到服务器,然后配置服务器https访问。
nginx 服务器配置范例:

server {
     listen 443 ssl;
     server_name test.app.com;
     root /www/public;
     ssl_certificate "/data/nginx/conf/ssl/app.crt";
     ssl_certificate_key "/data/nginx/conf/ssl/app.key";
}
1
2
3
4
5
6
7