利用OpenSSL生成自签名TLS/SSL证书,由于此证书非权威CA机构颁发,因此在浏览器等客户端访问经此证书加密的网站还需要手动安装CA根证书。

主要步骤为①创建CA服务器,生成CA Private KEY和CA证书,②生成服务端的证书,*③可选步骤,如果需要双向认证则生成客户端的证书

OpenSSL

搭建CA服务器步骤

生成CA RSA私钥文件

openssl genrsa -out ca.key 2048

生成CA CSR请求签署文件

Cerificate Signing Request
即证书请求文件,生成 X509 数字证书前,一般先由用户提交证书申请文件,然后由CA来签发证书。大致过程如下(X509 证书申请的格式标准为 pkcs#10 和 rfc2314):用户生成自己的公私钥对,构造自己的证书申请文件,符合PKCS#10标准,用户将证书申请文件提交给CA。
可以理解为到证书之间的一个过程文件,带有一些扩展信息,如果直接带向x509也可以不生成CSR,直接生成证书文件。

openssl req -new -out ca.csr -key ca.key

提示:上面的命令输入后会弹出要求输入国家、组织信息的交互解密,也可以使用-subj直接输入则不会有交互解密

openssl req -new -out ca.csr -key ca.key -subj '/C=CN/ST=BJ/L=BJ/O=CA/OU=CA/CN=ca.com/'

生成CA自签证书

openssl x509 -req  -in ca.csr -out ca.crt -signkey ca.key -days 3650

*导出P12证书
Windows系统也认P12证书,如果需要导出P12证书可以用以下命令,其中ca.pem也可以是ca.crt

openssl pkcs12 -export -clcerts -in ca.pem -inkey ca.key -out ca.p12

至此CA 证书服务器已经搭建完成

根据CA给服务端颁发证书

生成服务端RSA私钥

openssl genrsa -out server.key 2048

生成服务端CSR请求签署文件

openssl req -new -key server.key -out server.csr

提示:上面的命令输入后会弹出要求输入国家、组织信息的交互解密,也可以使用-subj直接输入则不会有交互解密。此文件中的国家、州、地区以及公司名字可以与CA不一致

openssl req -new -key server.key -out server.csr -subj '/C=CN/ST=GuangDong/L=Shenzhen/O=MIA/OU=DEV/CN=*.domain.com/'

Chrome的验证机制较严,还需要加扩展文件信息

vi req.ext

信息示例如下,注意SubjectAlternativeName下的DNS可以与CN不一致,可以多加几个如DNS.2=add.new.com,加多少个都是SSL证书最终认可的域名

keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName

[ SubjectAlternativeName ]
DNS.1=*.domain.com

签署服务端证书

如果要生成PEM证书即将server.crt后缀改为.pem即可

openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -days 3650 -extfile req.ext -set_serial 1

*根据CA给客户端颁发证书

客户端证书主要是用于服务端与客户端数据传输双向认证的过程,一般场景较少

说明:以下步骤具体没有验证过,可以参考服务端的过程

生成客户端RSA私钥

openssl genrsa -out client.key 2048

生成客户端CSR请求签署文件

openssl req -new -key client.key -subj "/CN=m.miacraft.cn" -out client.csr

签署客户端证书

如果要生成PEM证书即将client.crt后缀改为.pem即可

openssl req -x509 -sha256 -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -in client.csr -out client.crt

*参数与配置说明

证书补充信息字段说明

-subj参数

字段简写代表说明
Country NameC国家代号,ISO国家代码了,如中国为CN
State or Province NameST省或州名称
Locality NameL地区名称,如城市
Organization NameO组织名称,公司名称
Organizational Unit NameOU组织单元,部门
Common NameCN必须输入项,通用名称,此处可以为域名,可以用通配符表示域名如*.domain.com
Email AddressemailAddress邮箱地址

CA配置文件说明

默认文件位置/etc/pki/tls/openssl.cnf

[ ca ]
default_ca      = CA_default            # The default ca section

####################################################################
[ CA_default ] //定义openssl作为CA使用时相关配置

dir             = /etc/pki/CA           # openssl作为CA使用时路径
certs           = $dir/certs            # 已颁发证书的存储位置
crl_dir         = $dir/crl              # 已吊销证书的吊销列表的存放位置
database        = $dir/index.txt        # 证书索引文件                (默认没有需要创建)
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # 新颁发证书的存储位置

certificate     = $dir/cacert.pem       # CA的公钥文件名
serial          = $dir/serial           # 记录过去签发的所有证书的序列号【每签发一个证书 自动+ 1】 (文本文件 需要创建)
crlnumber       = $dir/crlnumber        # 已吊销证书编号
                                      
crl             = $dir/crl.pem          # 证书吊销列表
private_key     = $dir/private/cakey.pem# CA自己的私钥文件
RANDFILE        = $dir/private/.rand    # 随机数的获取位置 (隐藏文件)

x509_extensions = usr_cert              # 用户证书                                                    


default_days    = 365                   # 颁发证书默认有效时间
default_crl_days= 30                    # how long before next CRL
default_md      = default               # use public key default MD
preserve        = no                    # keep passed DN ordering

==============================================================================
[ policy_match]
此段为证书相关信息选项,其中match指定的项,要求被签名证书一定要与CA的对应项一致。

[ req_distinguished_name ]
此段为CA证书的默认配置

其它依赖的文件

如果在创建CA证书和服务端证书的时候没有指定路径,则使用默认的配置中的路径,为了能使证书可以工作还需要创建两个依赖文件

touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
文件名说明
index.txt证书索引文件,里面会有证书的扩展信息,如国家、地区、组织等
serial记录签发证书的序列号,所以创建后要对其赋值00或其他,然后每签发一个证书自动+1,示例中使用了set_serial命令是相同的功能

openssl命令参数说明

参数说明
genrsa生成RSA密钥
-out输出位置
2048如果是在RSA密钥的时候则为RSA密钥强度
-key私钥文件,指明从哪个私钥文件中提取公钥创建证书请求
-new生成新的证书
-x509生成自签证书,如果不带则生成CSR证书签署请求文件
-days证书有效时长
-set_serial设置证书的序列号,多个证书可设置编号
-sha256指定HASH哈希算法为SHA256

证书使用

以上步骤(不包含客户端证书)最终产出ca.crt ca.csr ca.key req.ext server.crt server.csr server.key文件,服务端配置的时候使用server.crt和server.key即可。

可以在客户端安装ca.crt证书,则在浏览器访问的时候不会提示“证书不信任”

NGINX安装证书

找到NGINX配置

server {
    listen       443 ssl;
    server_name  www.domain.com;

    ssl_certificate      /usr/share/nginx/server.pem;
    ssl_certificate_key  /usr/share/nginx/server.key;

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

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

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

配置好后需要重启NGINX,每次修改配置或生成新证书都需要重启服务

CentOS 7安装CA根证书

说明:测试没有成功,在使用curl等工具访问仍会提示证书不安全,但是客户端工具一般可以忽略提示,如curl可以使用-k进行忽略
下载的CA证书将其移动到/opt目录

mv ca.crt /opt/

创建软链接

ln -s /opt/ca.crt  /etc/ssl/certs/myca.crt

更新证书,如果没有该命令则yum install ca-certificates

update-ca-trust

或者(这个还没测试过,可以试一下)

cp ca.crt /usr/local/share/ca-certificates/xray.crt
update-ca-certificates

Windows安装CA根证书

需要先安装CA证书,则该证书颁发的服务端和客户端证书都是被认证有效的

下载ca.crt证书,双击,点击“安装证书”,将其安装到“受信任的根证书颁发机构”即可

可以打开Windows证书管理器查看是否安装好相关证书,打开CMD使用以下命令,在刚才的路径“受信任的根证书颁发机构”找是否有相关证书

certmgr

安装好后打开浏览器访问相应网页即可

没有安装CA证书则在浏览器查看服务端的证书会使如下情况

no_CA

参考链接

生成CA和服务端证书,依赖与配置文件的一些参数,很多参数没有手动指定

https://blog.csdn.net/sinat_20184565/article/details/90302294

https://blog.51cto.com/1inux/1638154

出现“缺少主题备用名称”的参考

https://www.itranslater.com/qa/details/2325988825945867264

Consul配置证书

https://segmentfault.com/a/1190000019914825

生成CA和服务端还有客户端,带NGINX配置,还有双向认证的NGINX配置

https://www.jianshu.com/p/b932ca0726f3

OpenSSL Windows下载

http://slproweb.com/products/Win32OpenSSL.html

Last modification:March 21st, 2022 at 09:32 pm
硬币投入口