1. 常用OpenSSL命令
OpenSSL常用命令允许您生成CSR,证书,私钥并执行其他各种任务。
- openssl req:req命令主要创建和处理证书请求
PKCS # 10
格式,它还可以创建自签名证书(例如,用作根CA) - openssl x509:x509命令是一个多用途的证书实用程序。它可以被用来显示证书信息,将证书转换为各种形式,像“ca”一样对证书请求进行签名,或者编辑证书信任设置。
- openssl ca:ca命令是一个最小的证书颁发机构(ca)应用程序。它可以用于对各种形式的证书请求进行签名并生成证书撤销列表。它还维护一个文本数据库签发证书及其状态。
1.1. 使用openssl生成证书、证书签名请求
// 生成证书请求+私钥
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或私钥中的信息,请使用这些命令
// 检查证书签名请求(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
。
// 检查公钥的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。
// 将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. 证书查看
当出现证书解析不了时候,注意分析是否证书格式输入问题
// 查看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转换)
// 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. 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的证书文件和私钥
// 基于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,基于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. 查看生成的证书请求:
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. 初始化相关文件:
touch ./db.txt
echo '01' > serial.txt
mkdir sign_cert
3.3.2. 利用openssl-ca.conf配置,进行服务器证书签发
// 签发服务器证书
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
后续相关部分:
[ 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目录清单
-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
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. 具体操作
// 下载解压
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