HTTPS(一)Openssl的升级和基本使用

AI 摘要: 本文介绍了常用的 OpenSSL 命令,用于生成 CSR、证书、私钥等操作。

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 和签名证书

  1. 创建自己的权限(即成为 CA)
  2. 为服务器创建证书签名请求(CSR)
  3. 使用 CA 密钥对服务器的 CSR 进行签名
  4. 在服务器上安装服务器证书
  5. 在客户端上安装 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 signing
  • database = $base_dir/db.txt # Database index file
  • serial = $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 上面需要放开钥匙串访问权限,相关导入流程:

  1. 打开钥匙串
  2. 选中系统,然后点”+“,导入项目,选中”cacert.pem“文件,输入 Mac 登陆密码
  3. 完成导入

整体 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. 参考