tomcat+https /mysql+ssl /nginx+https

发布时间 2023-05-30 11:55:35作者: O波V步

本文简要介绍CA和证书的基础知识,并演示openssl-1.0.2d的安装,CA证书生成、用户证书申请、使用CA签发用户证书等内容。

实验环境

操作系统:Windows

openssl版本:openssl-1.0.2d(官网获取)

1 基础知识

1.1 PKI

为解决Internet的安全问题,世界各国对其进行了多年的研究,初步形成了一套完整的Internet安全解决方案,即目前被广泛采用的PKI体系结构。

它是利用公开密钥技术所构建的,解决网络安全问题的,普遍适用的一种基础设施。美国政府的一个报告中把 PKI 定义为全面解决安全问题的基础结构,从而大大扩展了 PKI 的概念。而我们认为,采用了公开密钥技术的基础设施就可以称为 PKI 。公开密钥技术也就是利用非对称算法的技术。

PKI(PublicKeyInfrastructure)公钥基础设施是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书。PKI体系结构采用证书管理公钥,通过第三方的可信机构CA,把用户的公钥和用户的其他标识信息(如名称、e-mail、***号等)捆绑在一起,在Internet网上验证用户的身份,PKI体系结构把公钥密码和对称密码结合起来,在Internet网上实现密钥的自动管理,保证网上数据的机密性、完整性。

PKI 中最基本的元素就是数字证书。所有安全的操作主要通过证书来实现。 PKI 的硬设备还包括签置这些证书的证书机构 (CA) ,登记和批准证书签置的登记机构 (RA) ,以及存储和发布这些证书的电子目录。 PKI 中还包括证书策略,证书路径以及证书的使用者。所有这些都是 PKI 的基本元素。许多这样的基本元素有机地结合在一起就构成了 PKI 。

由于PKI体系结构是目前比较成熟、完善的Internet网络安全解决方案,国外的一些大的网络安全公司纷纷推出一系列的基于PKI的网络安全产品,如美国的Verisign,IBM,Entrust等安全产品供应商为用户提供了一系列的客户端和服务器端的安全产品,为电子商务的发展提供了安全保证。为电子商务、政府办公网、EDI等提供了完整的网络安全解决方案。

1.2 数字证书

1.2.1 数字证书简介

数字证书采用PKI(Public Key Infrastructure)公开密钥基础架构技术,利用一对互相匹配的密钥进行加密和解密。

每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥),由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,通过数字的手段保证加解密过程是一个不可逆过程,即只有用私有密钥才能解密,这样保证信息安全无误地到达目的地。用户也可以采用自己的私钥对发送信息加以处理,形成数字签名。由于私钥为本人所独有,这样可以确定发送者的身份,防止发送者对发送信息的抵赖性。接收方通过验证签名还可以判断信息是否被篡改过。即使已知明文、密文和加密密钥(公开密钥),想要推导出解密密钥(私密密钥),在计算上是不可能的。按现在的计算机技术水平,要破解目前采用的2048位RSA密钥,需要上千年的计算时间。

1.2.2 数字证书颁发机构-CA

数字证书是由认证中心颁发的,认证中心是一家能向用户签发数字证书以确认用户身份的管理机构,这样的证书颁发管理机构一般称为CA。

为了防止数字凭证的伪造,认证中心的公共密钥必须是可靠的,认证中心必须公布其公共密钥或由更高级别的认证中心提供一个电子凭证来证明其公共密钥的有效性,后一种方法导致了多级别认证中心的出现。

 

CA也拥有一个证书(内含公钥和私钥)。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书公钥,用以验证它所签发的证书。

数字证书颁发过程如下:用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。用户就可以使用自己的数字证书进行相关的各种活动。

如果一个用户想鉴别另一个证书的真伪,他会用 CA 的公钥对该证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。

通常情况下,证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。

目前,证书的格式和验证方法普遍遵循X.509 国际标准。

1.2.3 数字证书解决的问题

在使用数字证书的过程中应用公开密钥加密技术,建立起一套严密的身份认证系统,它能够保证:

信息除发送方和接受方外不被其他人窃取;

信息在传输过程中不被篡改;

接收方能够通过数字证书来确认发送方的身份;

发送方对于自己发送的信息不能抵赖。

以电子邮件证书为例,数字证书主要可以解决:

保密性:通过使用收件人的数字证书对电子邮件加密,只有收件人才能阅读加密的邮件,这样保证在Internet上传递的电子邮件信息不会被他人窃取,即使发错邮件,收件人由于无法解密而不能够看到邮件内容。

完整性:利用发件人数字证书在传送前对电子邮件进行数字签名不仅可确定发件人身份,而且可以判断发送的信息在传递的过程中是否被篡改过。

身份认证:在Internet上传递电子邮件的双方互相不能见面,所以必须有方法确定对方的身份。利用发件人数字证书在传送前对电子邮件进行数字签名即可确定发件人身份,而不是他人冒充的。

不可否认性:发件人的数字证书只有发件人唯一拥有,故发件人利用其数字证书在传送前对电子邮件进行数字签名后,发件人就无法否认发送过此电子邮件。

1.3 SSL证书

随着Internet的普及、各种电子商务活动和电子政务活动的飞速发展,数字证书开始广泛地应用到各个领域之中,目前主要包括:访问安全站点(服务器证书,即SSL证书)、软件安全认证(代码签名证书)、发送安全电子邮件(个人电子邮件证书)、网上招标投标、网上签约、网上订购、安全网上公文传送、网上缴费、网上缴税、网上炒股、网上购物和网上报关(个人签名及加密证书)等。

1.3.1 SSL简介

SSL(Secure Sockets Layer,安全套接层)是支持在网络服务器(主机)与网页浏览器(客户端)间建立加密连接的标准技术。运用SSL技术后,保证了主机与客户端连接过程中的数据安全。随着电子商务的发展,越来越多的运用SSL保护用户在线交易的安全性。如果您访问某网站时,在浏览器地址栏输入的地址以“https://”开头,则代表您正通过SSL建立安全连接。

 

使用SSL证书后,即在用户网络浏览器及网络服务器间创建了加密数据连接,这也就意味着,服务器与浏览器间的任何交易数据在解密前是不可读的。因此,正由于加密数据不易理解性,也防止了网络中的第三者窥探数据信息。

如何建立加密连接

 

在尝试建立安全连接前,需要进行以下三步操作:

1、在地址栏输入或选择安全URL,例如“https://www.baidu.com”;

2、服务器在收到您发送的安全连接请求后,提交尝试在浏览器与服务器间建立可信任连接的回复,这也就是所谓的“SSL握手”;

3、通过SSL握手验证SSL证书后,服务器与客户端间的数据将会以加密的形式传输,保证其隐私与安全。

1.3.2 如何辨别网站是否使用SSL

如果网站使用了SSL证书,虽然SSL协议具体内容并不会直接展示给用户,但大部分浏览器支持在地址栏显示一个锁的图案或其他形式证明其使用了SSL,这也表明了您目前正享受SSL加密会话的保护。如果您想了解SSL证书详细信息,只需点击地址栏头部“锁”的图标即可。

1.3.3 SSL对访问者意味着什么

大部分SSL证书包含域名、公司名称、国家及详细地址,当然也包含证书的有效期与证书颁发机构的详细信息。当浏览器尝试与网站建立SSL连接时,会首先核实证书是否过期,是否由可信任的机构颁发以及网站是否正确。如果有任一项出现错误,浏览器将会提示警告,告知用户网站未使用SSL。

参考:来自51CTO博客作者泪痕之木的原创作品:https://blog.51cto.com/leihenzhimu/1719977

一、Tomcat实现https访问

1.到bin目录下

首先进入jdk的bin目录,找到keytool

2.在该目录下打开命令窗口

回车即可

3.输入命令

然后在窗口输入这个命令:

keytool -genkey -v -alias zkahkeystoreKey -keyalg RSA -validity 3650 -keystore E:\tools\KD\apache-tomcat-9.0.10-bjgmk\conf\tomcat.keystore
  keytool -genkey:自动使用默认的算法生成公钥和私钥
  -alias 名称 :给证书取个别名,这里设置的是keystoreKey
  -keyalg:制定密钥的算法,如果需要制定密钥的长度,可以再加上keysize参数,密钥长度默认为
  1024位,使用DSA算法时,密钥长度必须在512到1024之间,并且是64的整数倍
  -validity:证书的有效日期,默认是90天,这里设置的3650天
  -keystore:参数可以指定密钥库的名称,密钥库其实是存放秘钥和证书文件,会将生成的证书存放到指定的目录下。

4.配置

接下来就是修改tomcat的配置文件。

找到tomcat的/conf/server.xml,找到如下位置

代码:

<Connector port="8090" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="D:\Java\Java\apache-tomcat-8.5.39\conf\tomcat.keystore"
keystorePass="Wtf@1524" />

二、Nginx实现HTTPS访问

1.安装 OpenSSL

首先需要安装 OpenSSL 工具。可在此链接: https://slproweb.com/products/Win32OpenSSL.html

下载适用于 Windows 的 OpenSSL 安装包并进行安装。

2.生成私钥和 CSR (Certificate Signing Request)

 执行以下命令生成一个 RSA 私钥:

openssl genrsa -out private.key 2048

接着,输入以下命令来生成 CSR 文件:

openssl req -new -key private.key -out certificate.csr

在此过程中会要求您填写一些关于证书颁发机构(CA)的信息,例如公司名称、国家、省份、城市等。

3. 自签名证书

如果您不想从证书颁发机构获得证书,您可以使用自签名证书。执行以下命令来创建自签名证书:

openssl x509 -req -days 3650 -in certificate.csr -signkey private.key -out certificate.crt

-days: ----参数指定这个证书有效期为 3650 天。

4.配置Nginx

使用生成的证书。在您的Nginx配置文件中添加以下行

server {
listen 443 ssl;
ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/private.key;
}

在这里,您需要将 /path/to 替换为存储证书和私钥文件的实际路径。保存并关闭配置文件。重新启动Nginx服务器以使更改生效

三、MySQL加SSL

配置MySQL 5.7.17的SSL连接涉及到以下步骤:

1. 生成SSL证书和密钥文件
2. 配置MySQL服务器以使用SSL
3. 重启MySQL服务器
4. 验证SSL配置
5. 配置客户端连接

1.生成SSL证书和密钥文件

首先,需要生成SSL证书和密钥文件。可以使用OpenSSL工具生成这些文件。从官方网站下载并安装OpenSSL:https://www.openssl.org/source/

使用命令提示符(以管理员身份运行)导航至OpenSSL的bin目录,例如:C:\Program Files\OpenSSL-Win64\bin

1.1 生成 CA 私钥:
openssl genrsa -out ca-key.pem 2048
1.2 生成 CA 证书

向系统提供一些关于此证书的信息。例如,国家,组织名称等。

openssl req -new -x509 -nodes -key ca-key.pem -out ca-cert.pem
1.3 生成服务器私钥
openssl genrsa -out server-key.pem 2048
1.4 生成服务器证书签名请求
openssl req -new -key server-key.pem -out server-req.pem

向系统提供关于此证书的信息。

1.5 导出服务器证书
openssl x509 -req -in server-req.pem -days 365 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
1.6 生成客户端私钥
openssl genrsa -out client-key.pem 2048
1.7 生成客户端证书签名请求

向系统提供关于此证书的信息。

openssl req -new -key client-key.pem -out client-req.pem
1.8 导出客户端证书
openssl x509 -req -in client-req.pem -days 365 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

其中,2048 是私钥文件的长度,可以根据实际需求进行修改;ca-cert.pem 和 ca-key.pem 分别是 CA 机构的证书和私钥文件,可以根据实际情况进行修改。

1.9其他方式

生成自签名SSL证书:

openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -subj "/C=US/ST=California/L=San Francisco/O=My Company/CN=mysql.example.com" -keyout server-key.pem -out server-cert.pem

其中: - `days
3650` 表示 SSL 证书的有效期限,单位是天; - `/C=US/ST=California/L=San Francisco/O=My Company/CN=mysql.example.com` 表示证书相关信息,可以根据实际情况修改;
此时,将生成 `server-key.pem` 和 `server-cert.pem` 两个文件。

2.配置MySQL

所有证书和密钥文件都在OpenSSL的bin目录中,现在可以将这些文件移到MySQL数据目录中,例如 `C:\ProgramData\MySQL\MySQL Server 5.7`,

配置MySQL服务器以使用SSL。具体操作步骤如下:

- 将 client-cert.pem 和 client-key.pem 文件复制到 MySQL 服务器的某个目录下;

在`[mysqld]`部分添加以下行:

[client]
ssl-ca=C:/ProgramData/MySQL/MySQL Server 5.7/ca-cert.pem
ssl-cert=C:/ProgramData/MySQL/MySQL Server 5.7/client-cert.pem
ssl-key=C:/ProgramData/MySQL/MySQL Server 5.7/client-key.pem

[mysqld]
ssl-ca=C:/ProgramData/MySQL/MySQL Server 5.7/ca-cert.pem
ssl-cert=C:/ProgramData/MySQL/MySQL Server 5.7/server-cert.pem
ssl-key=C:/ProgramData/MySQL/MySQL Server 5.7/server-key.pem

确保将路径更改为刚刚创建的证书和密钥文件的实际路径。

其中,ca-cert.pem 是 CA 机构的证书文件,server-cert.pem 和 server-key.pem 是 MySQL 服务器端的证书和私钥文件。

ca-key.pem # CA 私钥
ca-cert.pem # 自签的CA证书,客户端连接也需要提供
client
-cert.pem # 客户端连接服务端需要提供的证书文件 client-key.pem #客户端连接服务端需要提供的私钥文件
private_key.pem #私钥公钥的私有成员 public_key.pem #私钥公钥的共有成员
server
-cert.pem #服务端证书文件 server-key.pem #服务端私钥文件

3.重启MySQL服务器

为了让更改生效,需要重启MySQL服务。打开服务管理工具(services.msc),在列表中找到“MySQL”,右键单击并选择“重启”。

命令重启:

net stop mysql57
net start mysql57

4.验证SSL配置

使用命令提示符进入MySQL客户端,输入:

mysql -u root -p

输入root用户的密码,然后执行以下查询:

SHOW GLOBAL VARIABLES LIKE 'have_ssl';

结果应为:

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl | YES |
+---------------+-------+

这表明SSL已启用。

5.配置客户端连接

客户端连接时需指定SSL证书和密钥文件的路径。使用命令提示符输入以下命令以启用SSL连接:

mysql -u root -p -h 192.168.137.1 -P 3306 --ssl-ca="C:/ProgramData/MySQL/SSL/ca-cert.pem" --ssl-cert="C:/ProgramData/MySQL/SSL/client-cert.pem" --ssl-key="C:/ProgramData/MySQL/SSL/client-key.pem"


确保更改为实际的用户名称和证书文件的路径。

在MySQL提示符下,运行以下命令以检查SSL连接:

\ssl

输出应显示SSL状态为“启用”。

至此,已成功配置MySQL 5.7.17的SSL连接。

6.自签名证书使用的加密和协议版本

可以使用 OpenSSL 命令行工具进行查询。假设您的自签名证书位于 `/path/to/cert.pem`,可以使用以下命令查询:

openssl x509 -in server-cert.pem -text -noout

openssl rsa -in server-key.pem -check -noout

这将输出证书的详细信息,包括支持的加密算法和协议版本。在输出中,可以查看 `Signature Algorithm` 字段以确定证书使用的签名算法。此外,您还可以查看 `Public Key Algorithm` 字段以确定证书使用的公钥算法。对于 SSL/TLS 版本和密码套件,可以查看 `SSL Certificate` 部分。

例如,如果您的证书使用的是 TLS 1.2 协议,并且使用 AES256-GCM-SHA384 密码套件,在证书信息中应该会看到类似以下内容:

SSL Certificate:
Version: 3 (0x2)
Serial Number:
...
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = XX, ST = XX, L = XX, O = XX, OU = XX, CN = example.com/emailAddress = admin@example.com
Validity
Not Before: Aug 1 00:00:00 2020 GMT
Not After : Jul 31 23:59:59 2021 GMT
Subject: C = XX, ST = XX, L = XX, O = XX, OU = XX, CN = example.com/emailAddress = admin@example.com
...
X509v3 extensions:
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Subject Alternative Name:
DNS:example.com
X509v3 Subject Key Identifier:
...
X509v3 Authority Key Identifier:
...

X509v3 Basic Constraints:
CA:FALSE
X509v3 CRL Distribution Points:

Full Name:
URI:ldap:///...

Authority Information Access:

OCSP - URI:http://ocsp.digicert.com
CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt

X509v3 Subject Alternative Name:
DNS:example.com, DNS:www.example.com
X509v3 Certificate Policies:
Policy: 2.16.840.1.114412.1.2
CPS: https://www.digicert.com/CPS
Policy: 2.23.140.1.1
...

X509v3 TLS Web Server Authentication:
TLS 1.2, Cipher Suite 0000
SHA256 bits;
Signature Algorithm: sha256WithRSAEncryption
...
```

在此输出中,您可以看到 SSL/TLS 版本为 TLS 1.2,并且使用了 Cipher Suite 0000,也就是 AES256-GCM-SHA384 密码套件。

7.关闭其他连接方式

ssl=ON
require_secure_transport=ON

重启MySQL服务后,MySQL只能通过SSL方式访问了。

8.MySQL与openssl版本协议

不同版本的MySQL和OpenSSL版本协议的匹配方式会有所不同,以下是常用MySQL版本和对应OpenSSL版本的协议配对:

| MySQL版本 | OpenSSL版本 | 协议                                      |
|----------|-------------|-------------------------------------------|
| 8.0.23   | 1.1.1       | TLSv1.3, TLSv1.2, TLSv1.1                  |
| 8.0.22   | 1.1.1       | TLSv1.3, TLSv1.2, TLSv1.1                  |
| 8.0.21   | 1.1.1       | TLSv1.3, TLSv1.2, TLSv1.1                  |
| 8.0.20   | 1.1.1       | TLSv1.3, TLSv1.2                            |
| 8.0.19   | 1.1.1       | TLSv1.3, TLSv1.2, TLSv1.1                  |
| 8.0.18   | 1.1.1       | TLSv1.3, TLSv1.2, TLSv1.1, TLSv1.0          |
| 8.0.17   | 1.1.1       | TLSv1.3, TLSv1.2, TLSv1.1, TLSv1.0          |
| 8.0.16   | 1.1.1       | TLSv1.3, TLSv1.2, TLSv1.1, TLSv1.0          |
| 5.7.33   | 1.1.1       | TLSv1.3, TLSv1.2                            |
| 5.7.32   | 1.1.1       | TLSv1.3, TLSv1.2                            |
| 5.7.31   | 1.1.1       | TLSv1.3, TLSv1.2                            |
| 5.7.30   | 1.1.1       | TLSv1.3, TLSv1.2                            |
| 5.7.29   | 1.1.1       | TLSv1.3, TLSv1.2                            |
| 5.7.28 | 1.1.1b | TLSv1.3, TLSv1.2 |
| 5.7.27 | 1.1.1a | TLSv1.3, TLSv1.2 |
| 5.7.26 | 1.1.1a | TLSv1.3, TLSv1.2 |
| 5.7.25 | 1.1.1a | TLSv1.3, TLSv1.2 |
| 5.7.24 | 1.1.1a | TLSv1.2 |
| 5.7.23 | 1.1.1a | TLSv1.2 |
| 5.7.22 | 1.1.1a | TLSv1.2 |
| 5.7.21 | 1.1.0h | TLSv1.2 |
| 5.7.20 | 1.0.2l | TLSv1.2, TLSv1.1 |
| 5.7.19 | 1.0.2h | TLSv1.2, TLSv1.1 |
| 5.7.18 | 1.0.2g | TLSv1.2, TLSv1.1 |
| 5.7.17 | 1.0.2d | TLSv1.2, TLSv1.1 |
| 5.7.16 | 1.0.1m | TLSv1.2, TLSv1.1 |
| 5.7.15 | 1.0.1m | TLSv1.2, TLSv1.1 | | 5.6.50 | 1.0.2 | TLSv1.2, TLSv1.1, TLSv1.0 | | 5.5.62 | 1.0.2 | TLSv1.2, TLSv1.1, TLSv1.0 |

  注意:这里列出的协议按照OpenSSL官方文档的版本兼容性说明列出,对于不同的MySQL版本和OpenSSL版本组合,可能存在差异。在实际应用中,应根据具体的环境和需求进行选择和配置。

  MySQL的协议不仅受到OpenSSL版本的影响,还受到MySQL本身的选项配置影响,比如是否启用SSL、是否开启TLSv1.3等。因此,在实际使用中,需要根据具体的情况来进行选择和配置。

 9.证书格式转换

9.1 PFX→PEM(pkcs12)

假设目前拥有PKCS#12用户证书server.pfx

l 只导出用户证书
openssl pkcs12 -in server.pfx -nokeys -nodes -out servercert.pem
2 用户私钥导出
openssl pkcs12 -in server.pfx -nocerts -nodes -out serverkey.pem
3 CA证书导出
openssl pkcs12 -in server.pfx -cacerts -nokeys -out cacert.pem

选项:

-in filename:指定私钥和证书读取的文件,默认为标准输入。必须为PEM格式。
-out filename:指定输出的pkcs12文件,默认为标准输出。
-password arg:指定导入导出口令来源。
-passin arg:输入文件保护口令来源。
-passout arg:指定所有输出私钥保护口令来源。
-noout:不打印参数编码的版本信息。
-clcerts:仅仅输出客户端证书,不输出CA证书。
-cacerts:仅仅输出CA证书,不输出客户端证书。
-nocerts:不输出任何证书。
-nokeys:不输出任何私钥信息值。
-info:输出PKCS#12文件结构的附加信息值。例如用的算法信息以及迭代次数。
-des:在输出之前用DES算法加密私钥值。
-des3:在输出之前用3DES算法加密私钥值。此项为默认。
-idea:在输出之前用IDEA算法加密私钥值。
-aes128、-aes192、-aes256:在输出之前用AES算法加密私钥值。
-camellia128、-camellia192、-camellia256:在输出之前用camellia算法加密私钥值。
-nodes:对私钥不加密。
-nomacver:读取文件时不验证MAC值的完整性。
-twopass:需要用户分别指定MAC口令和加密口令。
文件创建选项:
-export:这个选项指定了一个PKCS#12文件将会被创建。
-in filename:指定私钥和证书读取的文件,默认为标准输入。必须为PEM格式。
-out filename:指定输出的pkcs12文件,默认为标准输出。
-inkey filename:指定私钥文件的位置。如果没有被指定,私钥必须在-in filename中指定。
-name name:指定证书以及私钥的友好名字。当用软件导入这个文件时,这个名字将被显示出来。
-certfilefilename:添加filename中所有的证书信息值。
-caname name:指定其它证书的友好名字。这个选项可以被用于多次。
-password arg:指定导入导出口令来源。
-passin arg:输入文件保护口令来源。
-passout arg:指定所有输出私钥保护口令来源。
-chain:如果这个选项被提出,则添加用户证书的证书链。标准CA中心用它来搜索。如果搜索失败,则是一个重大的错误。
-descert:用3DES对PKCS12进行加密,这样杨浦可能会导致PKCS12文件被一些“export grade”软件不能够读取。默认的是用3DES对私钥文件进行加密,用40位的RC2对证书公钥文件进行加密。
-certpbealg:该选项允许指定证书的加密算法。任何PKCS#5 v1.5或 PKCS#12 PBE类型的算法都可以被使用。默认使用的是40位的RC2。
-keypbe alg:该选项允许指定证书私钥的加密算法。任何PKCS#5 v1.5或 PKCS#12 PBE类型的算法都可以被使用。默认使用的是3DES。
-keyex:设置私钥仅仅被用于密钥交换。
-keysig:设置私钥仅仅被用于数字签名。
-macalg digest:指定MAC摘要算法。如果没有被指定,则默认使用sha1。
-nomaciter、-noiter:这个选项影响MAC值和密钥算法的迭代次数。除非你希望产生的文件能与MSIE 4.0相兼容,可以把这两个选项丢弃一边。
-maciter:加强完整性保护,多次计算MAC。
-nomac:不去规定MAC值的完整性。
-rand file(s):指定随机数种子文件,多个文件间用分隔符分开,windows用“;”,OpenVMS用“,“,其他系统用“:”。
-CApatharg:指定CA目录。该目录必须是一个标准证书目录:每个CA文件的文件名为XXXX.0,XXXX为其持有者摘要值。
-CAfile arg:指定CA文件。
-LMK:添加本地的机械属性到私钥中。
-CSP name:微软的CSP的名字。
-engine id:指定硬件引擎。
9.2 PEM→PFX(pkcs12)

假设目前拥有CA证书cacert.pem,用户证书servercert.pem,用户私钥serverkey.pem,需要生成PKCS12格式的server.pfx。

openssl pkcs12 -export -inkey serverkey.pem -in servercert.pem -certfile cacert.pem -out server.pfx
如果没有CA证书信息可添加,则不使用-certfile选项
openssl pkcs12 -inkey serverkey.pem -in servercert.pem -export -out server.pfx
9.3 PEM→DER/CER(x509)

由PEM格式证书文件servercert.pem输出DER格式文件servercert.der

openssl x509 -outform der -in servercert.pem -out servercert.der

选项:

-inform DER|PEM|NET 指定输入文件的格式。
-outform DER|PEM|NET 指定输出文件格式
-in filename 指定输入文件名
-out filename 指定输出文件名
-md2|-md5|-sha1|-mdc2 指定使用的哈希算法。缺省的是MD5于打印有关的option
-text 用文本方式详细打印出该证书的所有细节。
-noout 不打印出请求的编码版本信息。
-modulus 打印出公共密钥的系数值。没研究过RSA就别用这个了。
-serial 打印出证书的系列号。
-hash 把证书的拥有者名称的哈希值给打印出来。
-subject 打印出证书拥有者的名字。
-issuer 打印证书颁发者名字。
9.4 CER/DER→PEM(x509)

由DER格式用户证书servercert.der生成PEM格式用户证书servercert.pem

openssl x509 -inform der -in servercert.der -out servercert.pem
9.5 PEM→P7B(crl2pkcs7)

由PEM格式CA证书cacert.pem和用户证书servercert.pem,生成P7B格式用户证书servercert.p7b。

openssl crl2pkcs7 -nocrl -certfile servercert.pem -certfile cacert.pem -out servercert.p7b

选项:

-inform PEM|DER:输入文件的格式。DER是DER编码的CRL对象。PEM(默认的格式)是base64编码的CRL对象。
-outform PEM|DER:指定文件的输出格式,跟-inform的意思一样。
-in filename:指定CRL文件,不设置此项则从标准输入中获取。
-out filename:指定输出文件,不设置此项则输入到标准输出。
-certfile filename:指定证书文件,PEM格式的证书文件可以包含多个证书,此选项可以多次使用。
-nocrl:不处理crl。一般情况下,输出文件中包含crl信息,设置此选项时,读取时忽略CRL信息,生成的信息不保护CRL信息。
9.6 P7B→PEM(pkcs7)

由P7B格式用户证书servercert.p7b生成PEM格式用户证书servercert.pem

openssl pkcs7 -print_certs -in servercert.p7b -out servercert.pem

选项:

-inform PEM|DER::输入文件格式,DER或者PEM格式。DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式。
-outform DER|PEM:输出文件格式,DER或者PEM格式。
-in filename:输入的需要处理的文件,默认为标准输入。
-out filename:输出文件,默认为标准输出。
-print:打印出pkcs7的所有信息值。
-print_certs:打印证书或CRL信息,在一行中打印出持有者和颁发者。
-text:打印证书相关信息。
-noout:不打印证书信息值。
-engine id:指定硬件引擎。-engine id:指定硬件引擎。
9.7 P7B→PFX(pkcs7-pkcs12)
1 先将P7B格式证书转换为PEM格式
openssl pkcs7 -print_certs -in servercert.p7b -out servercert.pem
2 再将PEM格式证书转换为PFX格式
openssl pkcs12 -export -in servercert.pem -inkey serverkey.pem –certfile cacert.pem -out servercert.pfx