1. 常用 OpenSSL 命令
OpenSSL 常用命令允许您生成 CSR,证书,私钥并执行其他各种任务。
- openssl req:req 命令主要创建和处理证书请求
PKCS # 10
格式,它还可以创建自签名证书(例如,用作根 CA) - openssl x509:x509 命令是一个多用途的证书实用程序。它可以被用来显示证书信息,将证书转换为各种形式,像“ca”一样对证书请求进行签名,或者编辑证书信任设置。
- openssl ca:ca 命令是一个最小的证书颁发机构(ca)应用程序。它可以用于对各种形式的证书请求进行签名并生成证书撤销列表。它还维护一个文本数据库签发证书及其状态。
1.1. 使用 openssl 生成证书、证书签名请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| // 生成证书请求+私钥
openssl req -new -newkey rsa:2048 -nodes -keyout privateKey.key -out CSR.csr
// 生成x509自签名证书
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt
// 基于当前已有的私钥,生成证书签名请求(CSR)
openssl req -new -key privateKey.key -out CSR.csr
// 基于当前已有的证书,导出证书签名请求
openssl x509 -x509toreq -in certificate.crt -signkey privateKey.key -out CSR.csr
// 从当前私钥中,删除密码
openssl rsa -in privateKey.pem -out newPrivateKey.pem
// 使用CA的扩展,将证书签名请求,转换为自签名CA证书
openssl x509 -req -in careq.pem -extfile /etc/ssl/openssl.cnf -extensions v3_ca \
-signkey key.pem -out cacert.pem
// 使用上面的CA证书,签署证书签名请求,并添加用户证书扩展:
openssl x509 -req -in req.pem -extfile /etc/ssl/openssl.cnf -extensions v3_usr \
-CA cacert.pem -CAkey key.pem -CAcreateserial
|
1.2. 使用 openssl 校验
如果需要检查证书,CSR 或私钥中的信息,请使用这些命令
1
2
3
4
5
6
7
8
9
10
11
| // 检查证书签名请求(CSR)
openssl req -text -noout -verify -in CSR.csr
// 检查私钥
openssl rsa -in privateKey.key -check
// 检查x509证书
openssl x509 -in certificate.crt -text -noout
// 检查PKCS#12文件(.pfx或.p12)
openssl pkcs12 -info -in keyStore.p12
|
1.3. 使用 openssl 调试
如果您收到的错误是私有证书与证书不匹配,或者您安装到站点的证书不受信任,请尝试以下命令之一。
如果您要验证是否正确安装了 SSL 证书,请务必查看SSL Checker
。
1
2
3
4
5
6
7
| // 检查公钥的MD5哈希,以确保它与CSR或私钥中的内容匹配
openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in privateKey.key | openssl md5
openssl req -noout -modulus -in CSR.csr | openssl md5
// 检查SSL连接。应显示所有证书(包括中间体)
openssl s_client -connect www.paypal.com:443
|
更多s_client
客户端校对:https://www.poftut.com/use-openssl-s_client-check-verify-ssltls-https-webserver/
1.4. 使用 openssl 转换
这些命令允许您将证书和密钥转换为不同的格式,以使它们与特定类型的服务器或软件兼容。例如,您可以将可以与 Apache 一起使用的普通 PEM 文件转换为 PFX(PKCS#12)文件,并将其与 Tomcat 或 IIS 一起使用。使用我们的 SSL 转换器转换证书而不会弄乱
openssl。
1
2
3
4
5
6
7
8
9
10
11
| // 将DER文件(.crt .cer .der)转换为PEM
openssl x509 -inform der -in certificate.cer -out certificate.pem
// 将PEM文件转换为DER
openssl x509 -outform der -in certificate.pem -out certificate.der
// 将包含私钥和证书的PKCS#12文件(.pfx .p12)转换为PEM,您可以添加-nocerts以仅输出私钥或添加-nokeys以仅输出证书。
openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes
// 将PEM证书文件和私钥转换为PKCS#12(.pfx .p12)
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
|
2. OpenSSL 证书操作
OpenSSL 证书操作有四种基本类型,查看,转换,组合和提取
简易步骤:https://github.com/tkstorm/ss-cert
2.1. 证书查看
当出现证书解析不了时候,注意分析是否证书格式输入问题
1
2
3
4
5
6
7
| // 查看PEM编码证书
openssl x509 -in cert.pem -text -noout
openssl x509 -in cert.cer -text -noout
openssl x509 -in cert.crt -text -noout
// 查看DER编码证书(-inform指定格式)
openssl x509 -in certificate.der -inform der -text -noout
|
2.2. 证书转换
转换可以将一种类型的编码证书转换为另一种。(即 PEM To DER 转换)
1
2
3
4
5
| // PEM到DER
openssl x509 -in cert.crt -outform der -out cert.der
// DER到PEM
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
|
2.3. 组合
在某些情况下,将多个 X.509 基础结构组合成单个文件是有利的,一个常见的例子是将私钥和公钥组合到同一个证书中。
组合证书密钥和链的最简单方法是将每个密钥转换为 PEM 编码证书,然后将每个文件的内容简单复制到新文件中。这适用于组合文件以在 Apache 应用程序中使用。
2.4. 提取
有些证书将以合并形式出现,其中一个文件可以包含以下任何一个:证书,私钥,公钥,签名证书,证书颁发机构(CA)和/或授权链。
3. OpenSSL 自签名证书操作
除非先前将自签名证书导入浏览器,否则不会向任何第三方验证自签名证书。如果需要更高的安全性,则应使用由证书颁发机构(CA)签名的证书。
我们基于以下步骤创建自己的 CA 和签名证书
- 创建自己的权限(即成为 CA)
- 为服务器创建证书签名请求(CSR)
- 使用 CA 密钥对服务器的 CSR 进行签名
- 在服务器上安装服务器证书
- 在客户端上安装 CA 证书
大致的步骤:
1
2
3
4
5
6
7
8
9
10
| 1. Using the x509 module
openssl x509 ...
...
2. Using the req module
openssl req ...
3. Using the ca module
openssl ca ...
...
|
3.1. 步骤 1,创建自己的权限(即成为 CA)
创建一个具有 CA,这意味着 Subject 和 Issuer 是同一个实体,然后,将您的 CA 导入浏览器使用的 Trust Store。
3.1.1. 创建一个 ca 的 openssl.cnf 配置文件
openssl-ca.cnf 文件内容:https://github.com/tkstorm/ldenv/blob/master/https/openssl-server.cnf
标识信息(专有名称(DN),例如域名、公司组织、),以 X.509 证书中的样本为例:
- C: 国家/地区:您的组织合法注册的官方双字母国家/地区代码(即 US,CH)
- ST:州或省:贵组织合法注册的州或省。不要缩写。
- L: 城市或地区:贵组织合法注册的地区或城市。不要缩写。
- O: 组织:组织的完整法定名称,包括公司标识符。
- OU:组织单位(OU):您的部门,如“信息技术”或“网站安全”。
- CN:通用名称:您希望使用证书保护的 FQDN(完全限定的域名),例如www.google.com,secure.website.org,* .domain.net 等。
3.1.2. 基于配置生成 CA 的证书文件和私钥
1
2
3
4
5
6
| // 基于config生成CA证书
openssl req -x509 -config openssl-ca.cnf -nodes -newkey rsa:2048 -days 3650 \
-keyout cakey.pem -out cacert.pem
// 检测生成的CA证书
openssl x509 -in cacert.pem -noout -text
|
注意:如果是公司内部共用的 ca,还是建议设定密码,而不是采用忽略密码-nodes
3.2. 步骤 2,为服务器创建证书签名请求(CSR)
3.2.1. 创建一个 server 的 openssl.cnf 配置文件
openssl-server.cnf 文件信息内容: https://github.com/tkstorm/ldenv/blob/master/https/openssl-server.cnf
3.2.2. 基于 config 生成 CSR 证书请求(这一步可以不基于配置 config)
注意:生成 CSR 时候,一定要省略 -x509
,因为添加-x509
将创建证书,而不是请求。
-x509
: output a x509 structure instead of a cert. req.-days
: number of days a certificate generated by -x509 is valid for-config file
: request template file.-extensions ..
: specify certificate extension section (override value in config file)-reqexts ..
: specify request extension section (override value in config file)
1
2
3
4
5
6
7
8
| // 方式1,基于openssl-server.cnf配置创建服务器证书请求
openssl req -config openssl-server.cnf -newkey rsa:2048 -sha256 -nodes -keyout server-key.pem -out server-csr.pem
// 方式2,直接快速创建服务器证书请求
openssl req -newkey rsa:2048 -sha256 -nodes -keyout server-key.pem -out server-csr.pem \
-subj "/C=CN/ST=GD/L=ShenZhen/O=GlobaleGrow Inc./OU=Tech Development./CN=TK Server Development/emailAddress=tkstorm1988@gmail.com" \
-reqexts SAN -extensions SAN \
-config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost,DNS:www.tkstorm.cc,DNS:tkstorm.cc"))
|
3.2.3. 查看生成的证书请求:
1
2
3
4
5
| openssl req -in server-csr.pem -text -noout
// 注意以下SAN部分的信息
X509v3 Subject Alternative Name:
DNS:tkstorm.cc, DNS:www.tkstorm.cc, DNS:mail.tkstorm.cc
|
3.3. 步骤 3,使用 CA 密钥对服务器的 CSR 进行签名
3.3.1. 初始化相关路径和文件
a. 集合在openssl-ca.conf
中的 ca 基础配置,做相关初始化:
new_certs_dir = $base_dir/sign_cert
# Location for new certs after signingdatabase = $base_dir/db.txt
# Database index fileserial = $base_dir/serial.txt
# The next serial number to use in hex
b. 初始化相关文件:
1
2
3
4
5
| touch ./db.txt
echo '01' > serial.txt
mkdir sign_cert
|
3.3.2. 利用 openssl-ca.conf 配置,进行服务器证书签发
1
2
3
4
5
| // 签发服务器证书
openssl ca -config openssl-ca.cnf -policy signing_policy -extensions signing_req -infiles server-csr.pem
// 查看证书
openssl x509 -in sign_cert/02.pem -text -noout
|
针对配置文件中几点说明,注意base_dir
后续相关部分:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| [ ca ]
default_ca = ca_default # The default ca section
[ ca_default ]
default_days = 1000 # How long to certify for
default_crl_days = 30 # How long before next CRL
default_md = sha256 # Use public key default MD
preserve = no # Keep passed DN ordering
x509_extensions = ca_extensions # The extensions to add to the cert
email_in_dn = no # Don't concat the email in the DN
copy_extensions = copy # Required to copy SANs from CSR to cert
base_dir = .
certificate = $base_dir/cacert.pem # The CA certifcate
private_key = $base_dir/cakey.pem # The CA private key
new_certs_dir = $base_dir/sign_cert # Location for new certs after signing
database = $base_dir/db.txt # Database index file
serial = $base_dir/serial.txt # The next serial number to use in hex
unique_subject = no # Set to 'no' to allow creation of
# several certificates with same subject.
|
3.3.3. ls 目录清单
1
2
3
4
5
6
7
8
9
10
11
12
| -rw-r--r-- 1 Terry wheel 1127 4 27 19:06 cacert.pem
-rw-r--r-- 1 Terry wheel 916 4 27 19:06 cakey.pem
-rw-r--r-- 1 Terry wheel 106 4 27 19:08 db.txt
-rw-r--r-- 1 Terry wheel 20 4 27 19:08 db.txt.attr
-rw-r--r-- 1 Terry wheel 0 4 27 19:07 db.txt.old
-rw-r--r-- 1 Terry wheel 2804 4 27 19:04 openssl-ca.cnf
-rw-r--r-- 1 Terry wheel 1601 4 27 17:34 openssl-server.cnf
-rw-r--r-- 1 Terry wheel 3 4 27 19:08 serial.txt
-rw-r--r-- 1 Terry wheel 3 4 27 19:07 serial.txt.old
-rw-r--r-- 1 Terry wheel 1322 4 27 19:06 server-csr.pem
-rw-r--r-- 1 Terry wheel 1704 4 27 19:06 server-key.pem
drwxr-xr-x 3 Terry wheel 96 4 27 19:08 sign_cert/
|
3.4. 步骤 4,在服务器上安装服务器证书
nginx 官网: http://nginx.org/en/docs/http/configuring_https_servers.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| server {
listen 443 ssl;
listen 80 default_server;
root /data/www/frontend;
# ssl setting
keepalive_timeout 70;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_certificate ./ssl/tkstorm-cert.pem;
ssl_certificate_key ./ssl/tkstorm-key.pem;
# static files
autoindex on;
autoindex_localtime on;
location / {
try_files $uri $uri/ =404;
}
}
|
3.5. 步骤 5,在客户端上安装 CA 证书
MacOS 上面需要放开钥匙串访问权限
,相关导入流程:
- 打开钥匙串
- 选中系统,然后点”+“,导入项目,选中”cacert.pem“文件,输入 Mac 登陆密码
- 完成导入
整体 OK 后,以后由该 CA 自签名证书签发的其他证书均为可信
4. Openssl 升级安装
通常在一些 Linux 服务器上,会遇到安装的 openssl 版本比较低,需要进行相关升级,以下简单介绍了升级的相关方法
- openssl 官档:https://www.openssl.org/source/
- Fips 问题:
- FIPS 模块实际上是普通库版本的子集。对于相同的功能,普通 openssl 应该不会比 FIPS 模块更安全。
- FIPS 模块仅在完全不变的情况下使用时才进行验证。
- 如果在“正常 openssl”中发现错误并且发布了错误修正,那么该错误修复不会立即导入到 FIPS 模块中,因为这会使其 FIPSness 失效。(因此,可以认为,openssl 实际上比 FIPS 模块更安全,因为在漏洞被发现时,它被更快地修复。)
注意:如果您的目标不符合 FIPS 140-2 的某种标准,请使用正常的 openssl。
4.1. 具体操作
1
2
3
4
5
6
7
8
| // 下载解压
wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz -L
tar -zxf openssl-1.1.0h.tar.gz
// 编译安装
./config --prefix=/usr --openssldir=/usr/local/openssl shared
make && make install
// 版本查看
openssl version
|
5. 参考
- common-openssl-commands:https://www.sslshopper.com/article-most-common-openssl-commands.html
- openssl 官档:https://www.openssl.org/source/
- 如何转换证书格式
- 创建自己的 CA 证书
- man openssl