环境: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"

centos openssl自签名证书 openssl 验证证书签名_签名证书

使用者密钥标识符

授权密钥标识符

subjectKeyIdentifier=hash

authorityKeyIdentifier=keyid:always,issuer:always

centos openssl自签名证书 openssl 验证证书签名_签名证书_02

基本约束

(pathlen是子层数, 0的话就不能再为其他证书签名了)

basicConstraints = CA:FALSE, pathlen:0

centos openssl自签名证书 openssl 验证证书签名_客户端_03

密钥用法

keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyCertSign, cRLSign

centos openssl自签名证书 openssl 验证证书签名_签名证书_04

增强型密钥用法

extendedKeyUsage = serverAuth, clientAuth

centos openssl自签名证书 openssl 验证证书签名_客户端_05

使用者可选名称

subjectAltName = @alternate_names2

[ alternate_names2 ]
URI          = urn:*lin49940

DNS%20Name = **lin49940

centos openssl自签名证书 openssl 验证证书签名_签名证书_06

      上述表格是个人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-----