CentOS7 下使用 OpenSSL 生成 CA 自签发证书并解决 Windows 下信任证书后 Chrome 出现 ERR_CERT_COMMON_NAME_INVALID 的问题

主要是两个步骤:1、生成 SSL 私钥(.key 文件)和证书签发请求文件(.csr 文件);2、自己充当证书颁发机构(CA)进行签发生成证书(.crt 文件)。


1、检查是否已经安装 OpenSSL

openssl version

没有安装的话执行以下命令安装:

yum -y install openssl

2、生成私钥
秘钥文件名可以自己更改,我因为是给 K3s Rancher 用才这么命名。

# 允许后需要输入至少 4 位的密码,后面有去除密码的步骤因此随便输入即可
openssl genrsa -des3 -out rancher.key 4096

3、生成证书签发请求
在证书生成目录新建配置文件,以配置 SubjectAltName 来防止 Chrome 报“没有指定主题备用名称”的错误:

vi ext.ini

文件内容:

[ 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 = Zhejiang
localityName                = Locality Name (eg, city)
localityName_default        = Hangzhou
organizationName            = Organization Name (eg, company)
organizationName_default    = k3s
organizationalUnitName            = Organizational Unit Name (eg, section)
organizationalUnitName_default    = rancher
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_max              = 64
commonName_default          = rancher.k3s.cn

[ req_ext ]
subjectAltName = @alt_names

[alt_names]
DNS.1 = k3s.cn
DNS.2 = *.k3s.cn

subj 参数解释:

字段 字段含义 示例
/C= Country 国家 CN
/ST= State or Province 省 Zhejiang
/L= Location or City 城市 Hangzhou
/O= Organization 组织或企业 k3s
/OU= Organization Unit 部门 rancher
/CN= Common Name 域名或 IP rancher.k3s.com

生成证书请求文件:

openssl req -new -sha256 -out rancher.csr -key rancher.key -config ext.ini

4、去除私钥中的密码
以防止每次启动Web服务器时,都被要求输入密码:

openssl rsa -in rancher.key -out rancher.key

5、自己充当 CA 进行证书的签发

# 签发 10 年的证书
openssl x509 -req -days 3650 -in rancher.csr -signkey rancher.key -out rancher.crt -extensions req_ext -extfile ext.ini

完成后看下目录确定是否生成成功:

[[email protected] ~]# ls
# 有 .crt 文件说明成功
rancher.crt  rancher.csr  rancher.key  ext.ini

6、Nginx 配置

    ...
    ...
    server {
        listen      80;
        server_name rancher.k3s.com;

        # 强制跳转 HTTPS
        location / {
            # root    /usr/share/nginx/html;
            # index   index.html;
            return 301 https://$server_name$request_uri;
        }
    }

    server {
        listen      443 ssl;
        server_name rancher.k3s.com;

        # SSL 配置
        ssl_certificate             /etc/nginx/ssl/rancher.crt;
        ssl_certificate_key         /etc/nginx/ssl/rancher.key;
        ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers                 ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

        location / {
            root    /usr/share/nginx/html;
            index   index.html;
        }
    }
    ...
    ...

通过 HTTPS 访问仍然会显示不安全,查看下证书发现生效了但是因为是自签的所以不受信任:

7、Windows 本地信任证书

# cmd 键入 mmc 打开控制台
mmc

添加/删除单元:
添加/删除单元
为根节点添加证书选项,弹出框选择当前用户即可: 为根节点添加证书选项
根目录中导入证书:
根目录中导入证书
将服务上的 .crt 文件下载到本地,导入一路选择“是”即可完成导入:
导入成功
回页面看一眼证书现在已经被信任了:
被信任

8、Chrome 信任证书
存在一些情况 Edge 已经信任证书,但是 Chrome 还不信任:
Chrome 还不信任
前往 Chrome 高级设置里的证书处导入即可:
Chrome 导入

结束。