OpenSSL 证书生成实践
示例:
1 | # 生成 CA 私钥 |
生成私钥
openssl genrsa -out mydomain.com.key 2048检查私钥
openssl rsa -in mydomain.com.key -noout -text生成
CSR,注意Common Name指向服务器地址或域名,有互动、命令行和配置文件三种方式来生成
- 互动方式,
openssl要求填入一下信息用于生成CSRopenssl req -new -key mydomain.com.key -out mydomain.com.csr- 命令行,直接填入信息生成
CSRopenssl req -new -sha256 -key mydomain.com.key -subj "/C=US/ST=CA/O=MyOrg, Inc./CN=mydomain.com" -out mydomain.com.csr- 配置文件
openssl req -new -out mydomain.com.csr -config oats.conf检验
CSR,可选项openssl req -in mydomain.com.csr -noout -text由根证书签发用户证书
openssl x509 -req -in mydomain.com.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out mydomain.com.crt -days 500 -sha256检验用户证书,可选项
openssl x509 -in mydomain.com.crt -text -noout
1 一步到位:openssl req -x509 -nodes -newkey rsa:2048 -keyout key-name.pem -out pem-name.pem -days 365
第一种方式
通过openssl生成私钥
1 | openssl genrsa -out server.key 1024 |
使用私钥生成自签名的cert证书文件,以下是通过参数只定证书需要的信息
1 | openssl req -new -x509 -days 3650 -key server.key -out server.crt -subj "/C=CN/ST=mykey/L=mykey/O=mykey/OU=mykey/CN=domain1/CN=domain2/CN=domain3" |
1
2
3
4
5
6 openssl req -new -x509 -days 3650 \
-key server.key \
-out server.crt \
-subj "/C=CN/ST=Guangdong/L=Guangzhou Huangpu District/O=Self-signed Certificate/OU=Private Use/CN=yukifuhane.cn.eu.org" \
-addext "subjectAltName = DNS:yukifuhane.cn.eu.org, DNS:192.168.6.3, IP:192.168.6.3"
#-subj "/C=CN/ST=Guangdong/L=Guangzhou Huangpu District/O=Self-signed Certificate/OU=Private Use/CN=192.168.6.3" \
- 一般的数字证书产品的主题通常含有如下字段:
1
2
3 字段名 字段值
公用名称 (Common Name) 简称:CN 字段,对于 SSL 证书,一般为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端证书则为证书申请者的姓名;
单位名称 (Organization Name) 简称:O 字段,对于 SSL 证书,一般为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端单位证书则为证书申请者所在单位名称;
- 证书申请单位所在地
1
2
3 所在城市 (Locality)| 简称:L 字段
所在省份 (State/Provice)| 简称:S 字段
所在国家 (Country)| 简称:C 字段,只能是国家字母缩写,如中国:CN
- 其他一些字段
1
2
3
4
5
6
7 电子邮件 (Email)| 简称:E 字段
多个姓名字段 | 简称:G 字段
介绍 | Description 字段
电话号码:|Phone 字段,格式要求 + 国家区号 城市区号 电话号码,如: +86 732 88888888
地址:|STREET 字段
邮政编码: |PostalCode 字段
显示其他内容| 简称:OU 字段
如果对上面参数具体的说明不太了解的,可以使用不带参数的方式,通过命令行步骤生成,参考第二种方式。
第二种方式
通过openssl生成私钥
1 | openssl genrsa -out server.key 1024 |
根据私钥生成证书申请文件csr
1 | openssl req -new -key server.key -out server.csr |
这里根据命令行向导来进行信息输入:
ps.Common Name可以输入:*.yourdomain.com,这种方式生成通配符域名证书
使用私钥对证书申请进行签名从而生成证书
1 | openssl x509 -req -in server.csr -out server.crt -signkey server.key -days 3650 |
这样就生成了有效期为:10年的证书文件,对于自己内网服务使用足够。
第三种方式
直接生成证书文件
1 | openssl req -new -x509 -keyout server.key -out server.crt -config openssl.cnf |
ps.以上生成得到的server.crt证书,格式都是pem的。
证书的作用
1.加密通信数据
2.验证对象身份
3.保证数据完整性
自签名证书是什么
公认的证书往往都要收费,如果客户端与服务端都由自己来操控,便可以使用自签名证书(只是自己认可的证书)
CA签名证书
就是把我们自己当成认证机构去认证一个证书,客户端信任该CA证书也代表信任该CA证书签名的所有自签名证书
自签名证书应用场景
1.用于测试环境中需要使用证书时
2.用于构建根CA
自签名证书分为
1.自签名私有证书(无法被吊销)
2.自签名CA证书(可以被吊销)
两种自签名证书的区别在于
如果私钥不小心被恶意获取,私有证书不能被吊销,那么黑客有可能伪装成受信任的客户端与用户进行通信
如果需要创建多个客户端证书,使用自建签名证书的方法比较合适,只要给所有客户端都安装了CA根证书,那么以该CA根证书签名过的客户端证书都是信任的,不需要重复的安装客户端证书。
不过因为是自建的CA证书,在使用这个临时证书的时候,会在客户端浏览器报一个错误,签名证书授权未知或不受信任(signing certificate authority is unknown and not trusted),但只要配置正确,继续操作并不会影响正常通信。自签名证书的issuer和subject是一样的
openssl是什么
是一套开源的密码学工具包
在SSL协议中,我们使用了很多密码学手段来保护数据,其中包括对称密码,公钥密码,数字签名,证书,完整性校验,伪随机数生成等。由于这些算法和操作都非常复杂,于是开源社区就开发了一套库,这个库里面提供了很多现成的标准方法,其他开发者只要正确的调用这些方法,就可以实现SSL协议中的各种加密/解密操作了。
使用openssl的私钥产生公钥之前,需要了解以下几点:
1.key算法:openssl支持生成RSA,DSA,ECDSA的密钥对,但RSA是目前使用最普遍的。
2.key长度:RSA的2048是公认比较安全的key长度。
3.密码(Passphrase):在key上使用密码是一个可选值,但是一般都是强烈建议的,这样每次使用key文件时,都需要输入密码才能使用,增强了其安全性,但随之而来的易用性也会变差。
下面分别阐述如何使用openssl生成这两种自签名证书:
生成CA证书
1.生成CA证书的私钥key(ca.key)。以下输入了为这个key值设置了密码,且密码使用aes128加密保存:
1 | openssl genrsa -aes128 -out ca.key 2048 |
2.生成公钥
1 | openssl rsa -in ca.key -pubout -out ca-public.key |
3.生成CA的自签名证书ca.crt,此处的CA证书也是一个自签名证书
1 | openssl req -new -x509 -days 365 -key ca.key -out ca.crt |
以下命令可以不用在调用密钥文件的时候输入密码:
1 | openssl rsa -in ca.key -out ca.key |
查看自签名证书信息(颁发者):
1 | openssl x509 -in ca.crt -subject -issuer -noout |
使用CA证书签名自签名证书
步骤:也就是获取权威机构办法的证书(此处为我们刚才生成的CA证书),需要先得到私钥的key文件(.key),然后使用私钥的key文件生成sign req文件(.csr文件),最后把csr文件发给权威机构,等待权威机构认证,认证成功后,会返回证书文件(.crt)。
1.生成自签名证书私钥key(server.key)文件
1 | openssl genrsa -aes128 -out server.key 2048 |
2.利用私钥server.key文件生成自签名证书请求文件server.csr
生成csr文件时,需要填写一些关于待签人或者公司的一些信息,比如国家明,省份名,组织机构名,主机名,email名,有些信息可以不填写,使用.标识。
1 | openssl req -new -key server.key -out server.csr |
输入相应的信息后可以得到server.csr请求文件
3.使用CA证书对自签名证书请求文件进行签名,生成server.crt
1 | openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt |
查看自签名证书的过期时间:
1 | openssl x509 -in server.crt -subject -issuer -noout |
openssl生成root CA及签发证书
有时,使用SSL协议是自己内部服务器使用的,这时可以不必找第三方权威的CA机构做证书,可以做自签证书(自己创建root CA(非权威)。
主要有以下三个步骤:
A.创建openssl.cnf在使用default-ca时需要使用的SSL的工作目录(第一次必须要设置)
1.查看openssl的配置文件
1 | openssl version -a |
2.找到OPENSSLDIR: “/etc/pki/tls”的配置文件openssl.cnf
根据配置文件下的[ CA_default ]节点默认值,创建对应文件夹和文件。
1 | [ CA_default ] |
按顺序在/etc/pki/CA下执行以下命令创建文件夹和文件:
1 | mkdir certs(默认应该是存在的)存放已颁发的证书 |
执行完成后,当前目录为:
1 | [root@prometheus01 /etc/pki/CA]# ll |
B:生成CA根证书(root ca证书)
步骤:生成CA私钥(.key) –> 生成CA证书请求(.csr) –> 自签名得到根证书(.crt)(CA给自己颁发的证书)。
1 | 1.生成私钥ca.key |
C.用自签根证书ca.crt给用户证书签名。
步骤:生成私钥(.key) –> 生成证书请求(.csr) –> 用CA根证书签名得到证书(.crt)
1 | 1.openssl genrsa -out server.key 1024 |
D.证书的简单使用
把server.crt以及server.key保存在服务器端等待程序加载使用。
把ca.key保存在客户端,如果客户端需要验证服务器端发的证书时使用。
nginx官方文档中有关自签名证书的生成步骤:
Generate Certificates
To generate dummy certficates you can do this steps:
1 | cd /usr/local/nginx/conf |
Configure the new certificate into nginx.conf:
1 | server { |
Restart Nginx.
Now all ready to access using:
1 | https://YOUR_DOMAINNAME_HERE |
RSA是非对称加密,需要用两个密钥来加密和解密,这两个密钥是公钥和私钥






