环境:win10 64位, 安装版的OpenSSL-Win64, openssl 1.1.0f, x509证书, 环境变量配置openssl 的path, 操作在命令窗口完成
第一类: 自签名证书
自签名证书, 比一般过程(1, 生成密钥, 2, 生成请求, 3, CA签名证书), 整个过程一次完成, 一次性生成密钥和自签名的证书, 自签名的证书可以作为CA 根证书, 也可以为其他证书请求签名, 自签名的证书可以直接作为服务器端证书了(不推荐这样做).
cd G:\ca
openssl req -newkey rsa:2048 -new -x509 -nodes -out my-cert.crt -keyout my-cert.key -days 365 -subj "/C=CN/ST=gd/L=st/O=go/OU=go/CN=root/emailAddress=lin49940@go.com"
说明: -new -x509 一起出现就说明是要生成自签名证书
-nodes 说明不要密码, 有密码的话, 服务器启动的话是需要输入密码的
有密码要去掉密码的话, openssl rsa -in my-cert.key -out my-cert.key
-subj"...." 里的CN 是写你的名字或域名的, 如果你有域名, 请填上你的域名
-days 365 有效期1年, 没有这项的话就表示永久, 10年的话就是3560
第二类: 用私人CA 根证书签名的证书(可以用于服务器或客户端)
用同一个私人CA 根证书签名的这些证书, 一开始是没有什么服务器端或客户端的区分的, 一般是在确定它们用处后才区分的, 如已签名证书A 和 已签名证书B, 它们一开始是同级的, 在管理者确认要把A 作为服务器证书使用的时候, 依据服务器的要求, 可能A 还需要把证书+key 合并成一个pem, 再把这个pem 给服务器当证书, 这个时候证书A 就是服务器端证书了, A 的密钥要严格保存好, 不能给到其他人.
而证书B, 他可能会被给到客户, 包括证书和密钥, 客户使用证书B及其密钥, 连接服务器, 这时候证书B 就是客户端证书了, 根据实际情况, 可能证书B 需要通过openssl pkcs12 -export -clcerts 命令打包成一个client.12 给到用户.
以上A 和B 是我们自己的根据需求生成的证书, 如果是正规的操作, 应该是服务器方自己提供证书请求, 通过CA 机构中心得到被签名好的证书, 然后再申请客户端用的证书.
cd G:\ca
#生成服务器的密钥, 输入至少4位的密码
openssl genrsa -des3 -out server.key 2048
#去掉key 的密码, 不然服务器启动的时候需要输入密码
openssl rsa -in server.key -out server.key
#生成服务器证书请求, 要重点注意CN的设置, 不能空, 一般是填域名或你的名称, 不能重复
openssl req -new -key server.key -out server.req -subj "/C=CN/ST=gd/L=st/O=go/OU=go/CN=localhost/emailAddress=lin49940@go.com"
#用CA证书和CA key 为服务器证书签名, -set_serial 10 序列号, 后面的签名最好改一下序列号
openssl x509 -req -in server.req -CA my-cert.crt -CAkey my-cert.key -set_serial 10 -out server.crt
#合并key 和 服务器已签名证书为一个pem, 一些服务器是认这个的(可选)
copy /b /y server.key+server.crt server.pem
Cd G:\a
#生成客户端的密钥, 输入至少4位的密码
openssl genrsa -des3 -out client.key 2048
#去掉key 的密码
openssl rsa -in client.key -out client.key
#生成客户端证书请求, 要重点注意CN的设置, 不能空, 一般是你的名称, 不能跟服务器的重复
openssl req -new -key client.key -out client.req -subj "/C=CN/ST=gd/L=st/O=go/OU=go/CN=client/emailAddress=lin49940@go.com"
#用CA证书和CA key 为客户端证书签名, -set_serial 10 序列号, 后面的签名最好改一下序列号
openssl x509 -req -in client.req -CA my-cert.crt -CAkey my-cert.key -set_serial 11 -out client.crt
#合并key 和 客户端已签名证书为一个pem(可选)
copy /b /y client.key+client.crt client.pem
#生成客户端用的证书, 一些用代码连接的情况下会用到(可选)
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
第三类 吊销的证书
正规是要搞这些的, 只是一般人能都没去搞
最近搞OPC UA 的证书, 看了一些资料, 必须是x509 V3版本的, 并且要带一些扩展字段
-config openssl.cnf -extensions v3_self_signed
生成自签名证书V3 需要加上上面这2 个配置,
- -config openssl.cnf: *.cnf 文件可以在openssl 的里面有, 可以拷贝出来使用
- -extensions v3_self_signed: v3_self_signed 是配置在*.cnf 里面的一个配置段的标识, [ v3_client_signed ], 这个在整个*.cnf 文件里面必须是唯一不重复的, 后面的行就是扩展的参数配置
Netscape Comment | nsComment = "OpenSSL Generated Certificate client lin49940" | |
使用者密钥标识符 授权密钥标识符 | subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer:always | |
基本约束 (pathlen是子层数, 0的话就不能再为其他证书签名了) | basicConstraints = CA:FALSE, pathlen:0 | |
密钥用法 | keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyCertSign, cRLSign | |
增强型密钥用法 | extendedKeyUsage = serverAuth, clientAuth | |
使用者可选名称 | subjectAltName = @alternate_names2 [ alternate_names2 ] DNS%20Name = **lin49940 |
上述表格是个人lin49940整理处理的, 转载请留言!
不能在PowerShell 里面运行命令, 要在CMD 里面运行才行, 虽然都是成功生成证书,但是使用的时候前者就会有问题。
-----------------------------------------------------------------------------------------------------------------
网上最多的一种生成证书方式是
#在bin文件夹里面建立文件夹和文件
lin49940CA -- private (放CA 密钥对,签发会用到的,文件和密码)
|- newcerts (放生成的新的签发证书)
|- index.txt
|- index.txt.attr (必要的,解决签发证书的一个bug)
|- serial (serial 文件,没有后缀名,写入01)
#修改cfg 文件openssl.cfg
dir = D:/OpenSSL-Win64/bin/lin49940CA # Where everything is kept
这样的CA的key和证书的位置是被指定了的
严格按照key, req 和ca 的顺序来的
---------------------------------------------------------------------------------------------------------------------
用加密的密钥和没加密的秘钥, 最后产生的key 和证书, 内容会有区别, 在一些服务器使用会有问题(如mongodb)
没加密的
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAt9GINUwZYPQ66+eh/e7pBbsUiDRuhoYZhNwDe0N5Racg/glv
........................................
+Z+UNYORfpknHzib+MM9oMWbKN4sug/SRqH5i97HfbZ/Pq4Wzvt0Ng==
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDVjCCAj4CAQowDQYJKoZIhvcNAQELBQAwcDELMAkGA1UEBhMCQ04xCzAJBgNV
...........................................
6tuLQjn6cHSqM8uo2nZ6I5PaXSrbQ4NdJY6XrScdF2nLsObmpvJnRIA+
-----END CERTIFICATE-----
加密的
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,2CACB7EE5A6DE6E0
Gk7X6HZ5quOq1vaDWE8+Sd6qzvW4L/eyR7fvCUbuWJM+YUa5cJfrMwV7y7OPux1T
..............................
6cjmLC/ndJ5NxvRMF657/jtW4K/dkYXYQ5s6r9kYSARKz42DNadgzw==
-----END RSA PRIVATE KEY-----
Certificate:
...........................
Modulus:
00:cd:49:31:5c:26:9c:87:16:2b:72:d1:d3:9a:6b:
..................................
.....................................
Signature Algorithm: sha256WithRSAEncryption
7f:6a:c3:16:0a:3b:27:e8:5e:24:d5:be:ab:09:06:1b:8e:1d:
..................................
99:7f:f7:52
-----BEGIN CERTIFICATE-----
MIIDwDCCAqigAwIBAgIBAjANBgkqhkiG9w0BAQsFADBvMQswCQYDVQQGEwJjaDEL
.................................................
mX/3Ug==
-----END CERTIFICATE-----