密码学专题 OpenSSL标准转换指令
概述
- 繁多复杂的各种文件编码格式、证书格式和密钥格式等。事实上,并非OpenSSL开发者想要将数字世界弄得如此令人头疼,只是由于各种原因,数字世界存在各种不同的标准,为了尽量兼容这些不同的标准,OpenSSL开发者才相应地在其指令和代码中支持如此多的格式。
- 日常使用会面临处理这些不同标准之间相互兼容和转换的问题,比如将X.509证书转换成PKCS#12格式证书就是常见的任务。事实上,在OpenSSL的很多指令中提供了不同格式和标准之间的转换功能
- 本章将集中介绍pkcs8和nseq指令的使用及其相关的标准
PKCS#8标准简介
- 相对于其他标准,PKCS#8标准算是一个非常简单的标准了,它主要用于封装私钥和其他相关的属性信息。一般来说,PKCS#8格式的私钥都是被加密的,支持PKCS#5和PKCS#12标准定义的算法,当然,私钥也可以不加密。
- PKCS#8标准一方面可以增强私钥的安全性,另一方面也为用户提供了一种简单的确立信任关系的方式,这主要是基于私钥特别名称和最高层可信者的权威公钥等属性信息。
pkcs8指令介绍
功能概述和指令格式
- OpenSSL提供了pkcs8指令来执行PKCS#8标准相关的工作。它可以把私钥转化为PKCS#8的格式,也可以把PKCS#8格式的私钥转换成其他存储标准的格式。OpenSSL的pkcs8指令对加密和非加密格式的私钥都能进行处理,其支持的加密算法有PKCS#5(版本1.5和2.0)和PKCS#12两种标准的定义。OpenSSL提供的经过PEM编码的PKCS#8标准的文件,分为加密和非加密两种方式。
PKCS#8文件生成选项topk8
- 默认情况下,pkcs8指令会要求输入一个PKCS#8格式的密钥,并将其进行处理后转换成普通格式的密钥输出并存储,这种情况一般用于处理或者显示一个已经存在的PKCS#8密钥的内容。如果使用了topk8选项,则pkcs8指令会将输入的一个普通格式的密钥转换成PKCS#8标准封装的密钥并输出。
输入输出选项in,out,inform和outform
- in选项指定了输入密钥的文件名,默认情况下使用标准输入。如果输入的密钥是经过加密的,那么在读取密钥信息的过程中会提示输入加密口令。当然,如果你已经使用passin选项提供了加密口令,该提示信息就不会再出现。
- out选项指定了存储输出密钥信息的文件名,默认情况下是标准输出。如果选择了加密选项而又没有使用pasout选项指定加密口令时,在输出密钥时会提示输入加密口令。输出文件与输入文件在同一个文件夹下时不可以重名,否则生成的文件会在没有读原密钥文件之前覆盖原文件,出现读密钥错误。
- inform和outform选项分别指定了输入和输出文件的编码格式,支持的格式包括PEM和DER两种。
加密口令输入选项passin和passout
- 由于私钥的重要性,所以一般都使用了加密保护,加密保护使用的密钥和初始向量是从用户提供的口令中提取出来的,所以在使用密钥的时候也需要提供相同的口令进行密钥的解密。
- passin和passout选项分别指定了输入和输出密钥时进行加解密的口令源。
- 如果输入的密钥文件需要口令进行解密而却没有使用pasin选项提供口令,那么程序会在指令行提示用户输入解密口令。
私钥格式选项nocrypt,nooct,embed和nsdb
- 使用pkcs8指令时,通常情况下输入或是产生的PKCS#8格式的密钥都是使用口令基于某种算法加密的私钥信息结构。
- 如果使用nocrypt选项,则告诉指令其输入和产生的私钥都将是不经加密的私钥信息结构。私钥不进行加密,显然安全性会大大降低,所以除非万不得已,一般不推荐使用此选项。
- nooct选项用于产生一种非标准格式的RSA私钥,以兼容一些软件。RSA私钥一般明确要求被封装到一个OCTETSTRING字符串内。但是有些软件只能识别私钥自身,对附加的OCTETSTRING字符串不能识别。在这种情况下,就可以使用nooct选项去掉OCTETSTRING字符串。
- embed选项用于产生一种非标准格式的DSA密钥。在这种格式中,DSA参数内嵌到PrivateKey结构中。
- nsdb选项则用于产生一种兼容Netscape私钥数据库格式的DSA密钥。
密钥加密算法选项v2和v1
- v1选项用于选择PKCS#5v20中的所有算法。一般情况下,PKCS#8结构的私钥是使用pbeWithMD5AndDES-CBC这种口令加密算法加密的。虽然这种算法只使用了56bit的DES加密,但已经是PKCS#5v1.5中加密强度最高的算法。
- 使用v2选项则可以选择PKCS#5v2.0中更高强度的算法,这些算法有168bit的3DES或者128bit的RC2等。目前的软件支持PKCS#5v2.0的不多,但是如果你使用的范围都局限于OpenSSL,那么就一点问题都没有。
- v2选项有效的参数包括des,des3和rc2,OpenSSL推荐读者使用DES3这种加密算法。v1选项用于选择PKCS#5v1.5或者PKCS#12中定义的算法,事实上,也包含了部分PKCS#5v2.0中定义的算法。
- 表11-1列出了v1选项可以使用的参数及其含义。
engine选项
- 如果engine选项指定了有效的Engine设备,那么指令中任何该Engine设备支持的上述操作都会使用Engine设备的操作流程而不再使用OpenSSL算法库本身提供的函数。
- 对于pkcs8指令来说,可以使用engine设备的操作主要包括RSA或者DSA密钥产生和对私钥进行加解密的算法。
例子
Netscape证书标准
- 为了方便下载一系列的证书,尤其对于为了验证要下载一个证书链的情况,Netscape提供了一种名为Netscape证书序列(Netscape Certificate Sequence)的格式来封装一系列证书(事实上,里面采用了一个PKCS#7格式来封装证书),以便能够一次性地下载或者传输多个数字证书。
- 所以,某些时候,Netscape证书序列可以替代PKCS#7的作用,用来打包一系列证书。Netscape证书序列虽然不一定能够得到微软的支持,但是在其他一些开源软件和Linux软件中却得到了广泛的支持,我们也因此随时会面临要把普通的一些证书封装成Netscape证书序列的要求和任务。
- OpenSSL显然也考虑到了这些可能出现的问题,于是提供了本节要介绍的nseq指令。
功能概述和指令格式
- nseq指令的任务简单而明确:将普通X.509证书封装成Netscape证书序列,或者将Netscape证书序列转换成普通的X.509证书。
- 这个指令的格式简单,也容易掌握,其格式为:
输入和输出文件选项in和out
- in和out选项分别指定了输入和输出的文件名,默认是标准的输入和输出设备。
转化格式选项toseq
- 使用toseq选项告诉指令执行将一个或者多个普通X.509证书转换成一个Netscape证书序列的操作。如果不使用该选项,即默认情况下,输入的应该是一个Netscape证书序列文件,而输出的是一个或者多个普通X.509证书,当然,它们都存储在一个输出文件中。
例子
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446176.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!