OpenSSL Cookbook 2——私钥

来源:互联网 发布:淘宝开店要2张银行卡 编辑:程序博客网 时间:2024/06/03 19:34

英文版地址:https://www.feistyduck.com/library/openssl-cookbook/online/ch-openssl.html

大部分用户都是为了让自己的WEB服务器支持SSL才开始使用OpenSSL的,所以这里重点介绍一下这一案例的使用流程,这一流程主要分为以下三步,
1. 生成一个足够健壮的私钥
2. 使用步骤1生成的私钥创建自己的证书注册请求(CSR),并将CSR发送给CA
3. 获得CA根据你的CSR签发给你的证书,并将该证书安装到你的WEB服务器上

接下来的部分主要围绕以上三步展开。


私钥的生成
私钥的生成主要有以下三方面的考量:

  • 私钥算法(Key algorithm)

    OpenSSL支持三种私钥算法,RSA,DSA以及ECDSA。实践中需要根据使用的场景选择合适的算法。比如,在Web服务器领域几乎所有人都选择RSA算法,因为DSA的私钥最大长度被限定在1024位(IE浏览器不支持1024位以上的私钥),ECDSA还没有被CA广泛支持。

  • 私钥长度(Key size)

    缺省的私钥长度不够安全,你应该总是显式指出私钥的长度。例如,缺省的RSA私钥长度仅仅为512位,512位的RSA私钥长度现在已经很不安全了。当下2048位的RSA私钥长度是广泛认可的安全长度。如果使用DSA算法同样需要2048位私钥,如果是ECDSA则至少需要256位私钥。

  • 保护密码(Passphrase)

    Passphrase对于私钥来说是可选的,但是强烈建议给你的私钥加上保护密码。原因如下,私钥是安全通信的基础,一旦私钥失效则建立在其上的通讯都将失去保护,如何来保护我们私钥就成了重中之重。可供选择的私钥保护方法有很多,如果安全等级很高的话可以选择一些硬件保护方案。但是保护密码仍然是成本最低,且行之有效的法案。

  • 例子

$ openssl genrsa -aes128 -out fd.key 2048
Generating RSA private key, 2048 bit long modulus
….+++
………………………………………………………………………..+++
e is 65537 (0x10001)
Enter pass phrase for fd.key: ******
Verifying - Enter pass phrase for fd.key: ******

我们来稍微解释一下这个例子,genrsa顾名思义就是生成RSA算法密钥的命令。-ase128意思是明确指出密钥的保护密码算法除了这里的-ase128外还有-ase192、-ase256等。特别说明的是在这里最好不要用DES,3DES,SEED算法。-out 选项指出存放密钥的文件。2048就是我们指定的密钥长度。
这里有个需要特别注意的地方,公开幂的默认值是65537,理论上这个值可以随便取,而且值越小算法效率越高,早些时候通常的做法是设成3,但是发生过针对3的攻击事件,所以现在公认的兼顾了效率和安全的做法是设成65537

私钥生成后存储在私钥文件内,openssl生成的私钥文件格式默认是PEM格式的,PEM是文本格式的。如下面的结果:

$ cat fd.key
—–BEGIN RSA PRIVATE KEY—–
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,01EC21976A463CE36E9DB59FF6AF689A
vERmFJzsLeAEDqWdXX4rNwogJp+y95uTnw+bOjWRw1+O1qgGqxQXPtH3LWDUz1Ym
mkpxmIwlSidVSUuUrrUzIL+V21EJ1W9iQ71SJoPOyzX7dYX5GCAwQm9Tsb40FhV/
[21 lines removed…]
4phGTprEnEwrffRnYrt7khQwrJhNsw6TTtthMhx/UCJdpQdaLW/TuylaJMWL1JRW
i321s5me5ej6Pr4fGccNOe7lZK+563d7v5znAx+Wo1C+F7YgF+g8LOQ8emC+6AVV
—–END RSA PRIVATE KEY—–

内容看起来云山雾罩的,但是我们可以用下面的命令查看结构化的结果,这样我们就能一窥私钥的庐山真面目了。

$ openssl rsa -text -in fd.key
Enter pass phrase for fd.key: ******
Private-Key: (2048 bit)
modulus:
00:9e:57:1c:c1:0f:45:47:22:58:1c:cf:2c:14:db:
[…]
publicExponent: 65537 (0x10001)
privateExponent:
1a:12:ee:41:3c:6a:84:14:3b:be:42:bf:57:8f:dc:
[…]
prime1:
00:c9:7e:82:e4:74:69:20:ab:80:15:99:7d:5e:49:
[…]
prime2:
00:c9:2c:30:95:3e:cc:a4:07:88:33:32:a5:b1:d7:
[…]
exponent1:
68:f4:5e:07:d3:df:42:a6:32:84:8d:bb:f0:d6:36:
[…]
exponent2:
5e:b8:00:b3:f4:9a:93:cc:bc:13:27:10:9e:f8:7e:
[…]
coefficient:
34:28:cf:72:e5:3f:52:b2:dd:44:56:84:ac:19:00:
[…]
writing RSA key
—–BEGIN RSA PRIVATE KEY—–
[…]
—–END RSA PRIVATE KEY—–

私钥包含了安全通讯所需的所有信息,我们可以轻松地从私钥中导出公钥,如下面:

$ openssl rsa -in fd.key -pubout -out fd-public.key
Enter pass phrase for fd.key: ******

同样的我们生成的公钥文件也是PEM格式的,我们可以查看公钥的内容

$ cat fd-public.key
—–BEGIN PUBLIC KEY—–
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnlccwQ9FRyJYHM8sFNsY
PUHJHJzhJdwcS7kBptutf/L6OvoEAzCVHi/m0qAA4QM5BziZgnvv+FNnE3sgE5pz
iovEHJ3C959mNQmpvnedXwfcOIlbrNqdISJiP0js6mDCzYjSO1NCQoy3UpYwvwj7
0ryR1F+abARehlts/Xs/PtX3VamrljiJN6JNgFICy3ZvEhLZEKxR7oob7TnyZDrj
IHxBbqPNzeiqLCFLFPGgJPa0cH8DdovBTesvu7wr/ecsf8CYyUCdEwGkZh9DKtdU
HFa9H8tWW2mX6uwYeHCnf2HTw0E8vjtOb8oYQxlQxtL7dpFyMgrpPOoOVkZZW/P0
NQIDAQAB
—–END PUBLIC KEY—–

结果很清晰的显示出这是一个公钥文件,所以在实际运用中,生成完公钥文件后一般都会查看一下文件内容,确保生成的的确是想要的公钥文件且没有泄露私钥中其他重要的信息。

除了RSA算法的私钥外,OpenSSL还支持其他两种算法的私钥生成

DSA私钥生成:

$ openssl dsaparam -genkey 2048 | openssl dsa -out dsa.key -aes128
Generating DSA parameters, 2048 bit long prime
This could take some time
[…]
read DSA key
writing DSA key
Enter PEM pass phrase: ******
Verifying - Enter PEM pass phrase: ******

ECDSA私钥生成:

$ openssl ecparam -genkey -name secp256r1 | openssl ec -out ec.key -aes128
using curve name prime256v1 instead of secp256r1
read EC key
writing EC key
Enter PEM pass phrase: ******
Verifying - Enter PEM pass phrase: ******

特别需要注意的是如果你的openssl版本是1.0.2以上的,那么推荐使用genpkey 命令生成RSA,DSA,ECDSA的私钥。具体的命令实例请查看OpenSSL手册。

0 0
原创粉丝点击