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

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

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

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

  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. 具体操作

// 下载解压
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. 参考