密钥和证书管理
因为他们希望配置和运行一个web服务器,支持SSL,大多数用户转向使用实例。包含三部:
(1)生产私有key
(2)发送一个csr
(3)安装CA提供的证书
key生成
准备运行一个TLS服务器的第一步是生成一个私钥。在您开始以前,你决定:
- key算法
OpenSSL支持RSA,DSA,ECDSA和EdDSA密钥算法,但并非全部在实践中很有用。 例如,DSA已过时,而EdDSA尚未得到广泛支持。这使我们可以使用RSA和ECDSA算法在我们的证书中使用。 - key长度
默认密钥大小可能不安全,这就是为什么您应该始终显式设置密钥的原因,配置密钥长度。 例如,RSA密钥的默认值曾经是512位,很不安全。如果您今天在服务器上使用了512位密钥,那么入侵者可能会抢走您的512位密钥。证书并使用蛮力恢复您的私钥,之后她可能会冒充你的网页。 如今,已将2,048位RSA密钥视为安全的,或将256位用于ECDSA。 - 密码
使用带有密钥的密码短语是可选的,但强烈建议使用。受保护的钥匙可以安全地存储,运输和备份。另一方面,这些密钥是不便,因为没有密码就无法使用它们。例如,每次您希望重新启动Web服务器时,都可能会要求输入密码。对于大多数人来说,要么这太不方便,要么会带来不可接受的可用性影响。此外,在生产中使用受保护的密钥实际上并不会增加安全性很多。这是因为一旦激活,私钥将保持不受保护程序内存中;可以到达服务器的攻击者只要多付出些努力可以从那里获取密钥。因此,密码短语应仅被视为一种机制当生产系统上未安装私钥时,用于保护私钥。如果你需要更好的生产安全性,则应投资硬件解决方案。
要生成RSA密钥,请使用以下genpkey命令:
$ openssl genpkey -out fd.key \
-algorithm RSA \
-pkeyopt rsa_keygen_bits:2048 \
-aes-128-cbc
..........................................+++++
...................................................................+++++
Enter PEM pass phrase: ************
Verifying - Enter PEM pass phrase: ************
在这里,我指定了用AES-128保护密钥。 您也可以使用AES-256(-aes-256-cbc选项),但最好不要使用其他算法(例如DES,3DES,和SEED)
使用genpkey命令时,生成的私钥以PKCS#8格式存储,该格式只是文本,看起来并不多:
$ cat fd.key
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIhoRNbw0td8kCAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAECBBDFSl1XihviVZjciewGaX2IBIIE
0AwdC4Lo7ifCchS053DpFqfmc3zpyykHCF+Zxw5lEiGUM1u8+N8UiZcvB84Dq9oO
5/uYkQxAbMHzCWglHMDq/9rhvKKpj9lpQOg7lVw5ootz/iyNlE//KICqaM0Ynj5l
MUpuugOPfPLwXhlzxDCfPsSCYaB8E+r7cKVLFnMY2XtEq4M/1xB6Ew+CtQn/KGF6
jLPc18f/R5GtmcSz1cl9kMBqmhliW0GwQGNMyCB9Y4uEzeHina5Qt1nqtswK7CRH
DCIqUAqlQBdXpCX90YUTFEfcCGSg3J20GoHphjXjB2eR2qvM0i+3LWfuPBYL0zMU
XUID9pyW/XQlklp/QpQwH8jb9vGo2hTMnuISLfyKO373cI6aO13smwiaQ8x6+52N
IFbJZwpBTB/XYSy/W0qIrLWSWoGQVEKZGTKNSCLeGq03Iwm6u/fK5JK01vHVjEPs
S0+npEn2+N574cgqHDJ37mS3i0cLAr0pSvRFherPlG1AiPk6SxVddhcphi0GWfhp
p0KL7oZ677af4rofs6Bh6WO12Wpu0SmxhUP60HG6G659QiCL7xZU1yu0gxi5MANn
WTwTTGAfF5Of3OZ9UIhY6LRrmC3uuObtxmN2RDy3enfvlFCVnIlvpb8KH40CwBiJ
4SLFKiBCG07lpd1uZW/9ESJ8AwPXw3GGHlLq6SANgESxnZNNaxRKKNkTmkccIJCi
CquXtwh+K4mVOZ+HIMvWPzIOVU1yw96qBshsfqKYc5nbcz50Hn+xWtxe1q3Eleay
jzO9eXzuoBLesSK/S3EzFUQF9aCo+cWBNOgfH78HwvoUCTUP1ftxhRooZbkccWrH
N1hZJXIl9n2R+xSTW4nIyxChD1IvTgMffuboInJV2PjQRIROWl7f5Gl64eJkSzZX
DKXi73vSEUs2FoIJPRfxz6ANWws6SSetJyOdQeXx1yXFuYVcD8tfuPI9eQtz3T4N
5yAduDiLMLhzi2ZypvVqg/P71oqbUMm61m76mcQOaoCqrRQd9cVabS+vADxfRwlZ
zsV+MmQOxZcTw18Fa9TC/Rebd0AoQ406wITnyo3j4e5TgvBVJ7JX8cqobhDhuO8A
Sye6M5TQFn+M2C7aEY7Ef4fgmNHmzKuv39CjS93KgZ9kUJeDJMDhjy8Vd3x8Ee6H
TEKuoUegrrLeXqcmBui36xgmmY1OS6PdvvnhWjg0z7lcys+CK/ZjX1Ub/ahouNUN
y/mV4Br1lyKi2qsgpV5x3gBQz9YWplXngJDO7FRPh5VUp9w6uZ1zjqxbVeRZsiUf
iniWcStiTveB4tYbpQdRw1YQAe9ey8bwyJ79nk2zFdovxLspqbWH4JjPRGwRJV46
stx1ZwBzYWAlUweV5H1pBJ6e8U6UqBCFuI4fMSMpBZJpEFm6dXL6j1kMKUIkpPTo
eYVf05hlMylp0x7Xbn2uq2nXFQVR9Pxq8NhU9ju/p7kPQ/xNiupt9M8oeUYL03if
XTCO+fQeIeNJhcCCE4rHjOGHNByFXax0n64kkeYZU3J/U9vT9iOjPp0eMAZ92IVZ
N26tId3eQLOKSLaK0CNzoo8smNcFU6zuoLjINcwI2pPtwGNkylYmu7Bt+yjy8Csi
Z7FhAwbGSdqJYP1zvRGplOuoeeTUtkylaTlUc7uPCW1Q
-----END ENCRYPTED PRIVATE KEY-----
但是,私钥不仅是一堆随机数据,即使它看起来像这样。您可以使用以下rsa命令查看密钥的结构:
$ openssl pkey -in fd.key -text -noout
Enter pass phrase for fd.key: ****************
RSA Private-Key: (2048 bit, 2 primes)
modulus:
00:be:79:08:22:1a:bc:78:3c:17:34:4a:d3:5f:2b:
[...]
publicExponent: 65537 (0x10001)
privateExponent:
10:20:95:54:b5:e8:d1:51:5d:31:9b:48:4c:5d:90:
[...]
prime1:
00:f5:3f:74:cf:ef:8f:93:e9:54:b3:79:a1:f2:91:
5a:7e:15:13:26:f7:f9:d7:a8:f3:f9:6b:2b:90:93:
57:54:cc:84:c9:ea:6f:9f:39:ad:ad:60:4c:f0:68:
16:db:1a:49:51:56:87:f1:70:ae:c9:42:89:2a:38:
55:3e:17:a0:78:a7:52:49:10:79:cf:99:ae:53:c8:
e0:60:5d:7e:91:26:86:3b:79:d2:70:c0:39:38:dd:
ed:ee:75:c0:15:c6:30:51:00:a8:93:f3:8b:25:01:
04:25:72:fc:9c:e9:73:d0:93:11:2d:82:e2:e3:d0:
66:c0:36:2f:b6:de:de:0d:47
prime2:
00:c6:d2:ce:66:b5:35:6b:35:d7:bb:b0:e3:f4:2d:
[...]
exponent1:
00:e9:2e:e9:b9:5f:f5:2b:54:fa:c5:1f:4c:7d:5f:
[...]
exponent2:
00:83:ea:bc:ad:a2:cf:a5:a9:9c:d0:d8:85:f6:ae:
[...]
coefficient:
68:18:a7:4f:aa:86:a7:e0:92:49:76:8d:24:65:fa:
[...]
如果您只需要单独拥有密钥的公共部分,则可以使用以下方法实现rsa命令:
$ openssl pkey -in fd.key -pubout -out fd-public.key
Enter pass phrase for fd.key: ****************
如果您查看新生成的文件,就会发现标记清楚地表明包含的信息确实是公开的:
$ cat fd-public.key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0EdPg2Td9OoG9kQy91w4
OpE0kLVUBnffwlvEbFbx6tkkdJS67gcfWTBcoQMVuui0dsMEjFBoNjKP7XlhXl+p
vYGk5Po9jHNX51l5vXgJZjkKqDSGO4M/T8Gm5N4+bxXhrWetUi4CbPg18t04YVhQ
ddj3YTy0KWOiSggcH0StJLQzbJt67ATh4/b+CqfsCeUQn4egViuKzvg2SDueqO7v
iP3JIIM4KW1tCsofcD+dYPtqaP/YK1L7Bis/QuY5trqkA0yQ+vy60O8wn12+czSm
2ssL4deLDn/Qa6Ng+NDjY4UprC/jMIrae77Dv0CHj6aE9fVif3hdz/24PWntOzUg
FwIDAQAB
-----END PUBLIC KEY-----
验证输出是否包含您的期望是一种很好的做法。 例如,如果您忘记在命令行上包含-pubout开关,则输出将包含您的私钥而不是公钥。
对于ECDSA密钥,该过程与之相似,但无法创建任意大小的密钥。 而是,为每个关键点选择一个命名曲线,该曲线控制关键点的大小,但也控制其他EC参数。 以下示例使用名为Curve的P-256(或secp256r1)创建256位ECDSA密钥:
$ openssl genpkey -out fd.key \
-algorithm EC \
-pkeyopt ec_paramgen_curve:P-256 \
-aes-128-cbc
Enter PEM pass phrase: ****************
Verifying - Enter PEM pass phrase: ****************
OpenSSL支持许多命名曲线,但是对于Web服务器密钥,通常(仍然)只限于两条广泛支持的曲线:P-256(也称为secp256r1或prime256v1)和P-384(secp384r1)。在这两者中,P-256是足够安全的并提供更好的性能。如果您想查看OpenSSL支持的所有命名曲线的列表,可以使用ecparam命令和-list_curves开关获取它。 还支持最新添加的x25519,x448,ed25519和ed448,但它们是不同类型的曲线,必须使用-algorithm开关进行指定,例如:
$ openssl genpkey -algorithm ed25519
-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIF6K3m4WM7/yMA9COn6HYyx7PjJCIzY7bnBoKupYgdTL
-----END PRIVATE KEY-----
创建证书签名请求
拥有私钥后,您可以继续创建证书签名请求(CSR)。这是一个要求CA签署证书的正式请求,它包含请求证书的实体的公钥以及有关该实体的一些信息。这些数据将是证书的一部分。 CSR始终使用与其携带的公钥相对应的私钥进行签名。
CSR创建通常是一个交互式过程,在此过程中,您将提供证书可分辨名称的元素。仔细阅读openssl工具给出的说明;如果您希望字段为空,则必须在该行上输入一个点(.),而不仅仅是
打回车。如果您选择后者,则OpenSSL将使用默认值填充相应的CSR字段。(与默认的OpenSSL配置一起使用时,此行为没有任何意义,实际上每个人都这样做。当您意识到可以更改默认值(通过修改OpenSSL配置或提供自己的配置)后,这才有意义文件。)
$ openssl req -new -key fd.key -out fd.csr
Enter pass phrase for fd.key: ****************
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:GB
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Feisty Duck Ltd
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.feistyduck.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
生成CSR后,可使用它来签名自己的证书和/或将其发送到公共CA并要求其签名证书。 以下各节将介绍这两种方法。 但是在您这样做之前,最好再次检查一下CSR是否正确。 就是这样:
$ openssl req -text -in fd.csr -noout
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = GB, L = London, O = Feisty Duck Ltd, CN = www.feistyduck.com
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:8a:d5:de:69:30:c7:77:b0:a0:54:f7:b3:34:9a:
96:1c:23:81:e3:9c:0c:81:a6:8a:a5:14:76:f4:4c:
b3:10:cb:ee:50:d1:ea:70:e9:7f:8f:75:67:f9:12:
83:b0:11:e7:6c:64:de:bc:af:bd:3f:43:da:b8:41:
96:75:34:63:85
ASN1 OID: prime256v1
NIST CURVE: P-256
Attributes:
a0:00
Signature Algorithm: ecdsa-with-SHA256
30:44:02:20:52:b9:cf:ca:d1:25:1c:b7:57:65:fb:24:5d:95:
15:f0:39:79:36:6c:d6:0a:42:6e:26:7c:54:e8:71:17:a5:99:
02:20:5a:e0:cd:b3:60:ec:2c:fc:29:8c:f9:21:01:08:9a:a3:
0d:fc:9a:d3:4f:24:fb:23:4f:c6:d7:a2:14:d1:54:f9
从现有证书创建CSR
如果您要续订证书并且不想对其中显示的信息进行任何更改,则可以节省一些输入时间。 使用以下命令,可以从现有证书创建全新的CSR:
$ openssl x509 -x509toreq -in fd.crt -out fd.csr -signkey fd.key
无人值守的CSR生成
CSR生成不必是交互式的。使用自定义的OpenSSL配置文件,您既可以自动执行该过程(如本节中所述),又可以执行某些无法交互进行的操作(例如,如何在同一证书中拥有多个域名,如后面的部分所述)。例如,假设我们要自动生成www.csdn.com的CSR。我们将从创建具有以下内容的文件fd.cnf开始:
[req]
prompt = no
distinguished_name = dn
req_extensions = ext
input_password = PASSPHRASE
[dn]
CN = www.csdn.com
emailAddress = webmaster@csdn.com
O = Feisty Duck Ltd
L = London
C = GB
[ext]
subjectAltName = DNS:www.csdn.com,DNS:csdn.com
现在,您可以直接从命令行创建CSR:
$ openssl req -new -config fd.cnf -key fd.key -out fd.csr
签署自己的证书
如果您要配置TLS服务器供自己使用或进行快速测试,则有时您不希望去CA获得公众信任的证书。 仅使用自签名证书会容易得多。如果您已经拥有CSR,请使用以下命令创建证书:
$ openssl x509 -req -days 365 -in fd.csr -signkey fd.key -out fd.crt
Signature ok
subject=C = GB, L = London, O = Feisty Duck Ltd, CN = www.csdn.com
Getting Private key
Enter pass phrase for fd.key: ****************
实际上,您不必在单独的步骤中创建CSR。 以下命令创建仅以密钥开头的自签名证书:
$ openssl req -new -x509 -days 365 -key fd.key -out fd.crt
如果您不想被问到任何问题,请使用-subj开关在命令行上提供证书主题信息:
$ openssl req -new -x509 -days 365 -key fd.key -out fd.crt \
-subj "/C=GB/L=London/O=Feisty Duck Ltd/CN=www.csdn.com"
本文详细介绍了使用OpenSSL进行TLS服务器配置的相关步骤,包括生成RSA和ECDSA密钥,创建证书签名请求(CSR)以及自签名证书的签发。重点讨论了密钥算法的选择、密钥长度的安全性以及密码短语的作用。同时,还展示了如何从现有证书创建CSR以及无人值守的CSR生成方法。

2916

被折叠的 条评论
为什么被折叠?



