声明:OpenSSL之命令行详解是根据卢队长发布在https://blog.csdn.net/as3luyuan123/article/details/16105475的系列文章整理修改而成,我自己所做的工作主要是针对新的1.0.2版本进行验证,修改错别字,和错误,重新排版,以及整理分类,配图。 未经作者允许,严禁用于商业出版,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!
查看帮助的办法:openssl 命令 -h
。
命令 | 功能 | 备注 |
---|---|---|
证书类 | XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ===== |
req | PKCS10 X.509证书签名请求(CSR)管理。 | 申请证书 |
x509 | X.509证书管理。显示证书信息、转换证书格式、签名证书请求及改变证书信任设置 | 证书工具 |
verify | X.509证书验证。 | 证书验证 |
ca | 证书颁发机构(CA)管理。签发证书请求和生成CRL,维护一个已签发证书状态的文本数据库。 | 证书中心 |
crl | 证书撤销清单(CRL)管理。工具,用于处理PEM或DER格式的CRL文件 | 证书吊销 |
crl2pkcs7 | CRL到PKCS#7转换。根据CRL或者证书生成pkcs7消息; | 证书吊销 |
对称加密 | *XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX* | ===== |
enc | 加密和解密 | 对称加解密 |
摘要 | *XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX* | ==== |
dgst | 消息摘要计算。 | 摘要集合 |
非对称 | XXXXXXXXX所有的非对称都可以使用pkey系列来操作,鼓励使用pkey系列XXXXXXX | ====== |
pkey | 公钥和私钥管理。 | 非对称加密 |
pkeyparam | 公钥算法参数管理。 | 非对称加密 |
pkeyutl | 公钥算法加密操作实用程序。 | 非对称加密 |
genpkey | 生成私钥或参数。 | 非对称加密 |
PKI | XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | |
pkcs7 | PKCS7加密消息语法,各种消息存放的格式标准;用于处理DER或者PEM格式的pkcs7文件 | 消息格式 |
pkcs8 | 私钥转换工具,pkcs8格式 | 转换证书 |
pkcs12 | PKCS12数据管理。工具,用于生成和分析pkcs12文件 | 个人证书 |
工具 | XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ======= |
asn1parse | 解析ASN.1序列。用于诊断ASN.1结构的工具,也可从ASN.1数据中提取数据; | 诊断工具 |
ciphers | 密码套件描述,显示支持的加密套件 | |
cms | CMS(加密消息语法)实用程序 | |
engine | 引擎(loadble模块)信息和操纵。 | |
errstr | 错误字符串转换的错误号。 | |
nseq | 创建或检查netscape证书序列,多证书与netscape证书序列间相互转化 | 序列转换 |
ocsp | 在线证书状态协议实用程序。 | 在线证书状态 |
passwd | 生成散列密码。生成各种口令密文 | |
prime | 检查一个数是否是素数 | |
rand | 生成伪随机字节。 | |
smime | S / MIME邮件处理。处理S/MIME邮件,加密、解密、签名和验证 | 邮件验证工具 |
speed | 算法速度测量。,调整测试库的性能 | 性能工具 |
s_time | SSL连接定时器。提供的SSL/TLS性能测试工具,测试服务 | 性能工具 |
spkac | SPKAC打印和生成实用程序 | |
ts | 时间戳机构工具(客户端/服务器) | |
sess_id | SSL会话数据管理。SSL/TLS协议的session处理工具 | 协议会话工具 |
s_client | 这将实现一个通用SSL / TLS客户端,可以建立与远程服务器的SSL / TLS透明连接。 | 协议会话工具 |
s_server | 这实现了一个通用SSL / TLS服务器,它接受来自远程客户端的SSL / TLS连接。 | 协议会话工具 |
version | OpenSSL版本信息。 | |
===========全部已经时的禁止再使用,主要为了兼容=================== | ||
ec | EC(椭圆曲线)密钥处理,用于数字签名和加密 | ecc算法 |
ecparam | EC参数的操作和生成,产生ECC密钥对。用于数字签名和加密 | ecc算法 |
dh算法 | ||
dh算法 | ||
dh算法 | ||
rsa算法 | ||
rsa | RSA密钥管理。处理RSA密钥、格式转换和打印信息 | rsa算法 |
rsa算法 | ||
dsa | DSA数据管理。处理DSA密钥、格式转换和打印信息,用于数字签名 | dsa算法 |
dsa算法 | ||
dsa算法 |
对称加密算法工具。它能够运用块或者流算法对数据加/解密。还能够把加密/接密,还可以把结果进行base64编码。
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A]
[-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p]
[-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]
-pass pass:"123" #密码是123
-pass pass:123 #密码是123
-pass evn:VAR #密码从环境变量VAR中去
-pass file:p.txt #密码从文件p.txt第一行取,不包括换行符,注意DOS格式的^M及回车符。
-pass fd:3 #密码从文件描述符3中读
-pass stdin #标准输入
-aes-128-cbc -aes-128-cbc-hmac-sha1 -aes-128-cbc-hmac-sha256
-aes-128-ccm -aes-128-cfb -aes-128-cfb1
-aes-128-cfb8 -aes-128-ctr -aes-128-ecb
-aes-128-gcm -aes-128-ofb -aes-128-xts
-aes-192-cbc -aes-192-ccm -aes-192-cfb
-aes-192-cfb1 -aes-192-cfb8 -aes-192-ctr
-aes-192-ecb -aes-192-gcm -aes-192-ofb
-aes-256-cbc -aes-256-cbc-hmac-sha1 -aes-256-cbc-hmac-sha256
-aes-256-ccm -aes-256-cfb -aes-256-cfb1
-aes-256-cfb8 -aes-256-ctr -aes-256-ecb
-aes-256-gcm -aes-256-ofb -aes-256-xts
-aes128 -aes192 -aes256
-bf -bf-cbc -bf-cfb
-bf-ecb -bf-ofb -blowfish
-camellia-128-cbc -camellia-128-cfb -camellia-128-cfb1
-camellia-128-cfb8 -camellia-128-ecb -camellia-128-ofb
-camellia-192-cbc -camellia-192-cfb -camellia-192-cfb1
-camellia-192-cfb8 -camellia-192-ecb -camellia-192-ofb
-camellia-256-cbc -camellia-256-cfb -camellia-256-cfb1
-camellia-256-cfb8 -camellia-256-ecb -camellia-256-ofb
-camellia128 -camellia192 -camellia256
-cast -cast-cbc -cast5-cbc
-cast5-cfb -cast5-ecb -cast5-ofb
-des -des-cbc -des-cfb
-des-cfb1 -des-cfb8 -des-ecb
-des-ede -des-ede-cbc -des-ede-cfb
-des-ede-ofb -des-ede3 -des-ede3-cbc
-des-ede3-cfb -des-ede3-cfb1 -des-ede3-cfb8
-des-ede3-ofb -des-ofb -des3
-desx -desx-cbc -id-aes128-CCM
-id-aes128-GCM -id-aes128-wrap -id-aes192-CCM
-id-aes192-GCM -id-aes192-wrap -id-aes256-CCM
-id-aes256-GCM -id-aes256-wrap -id-smime-alg-CMS3DESwrap
-rc2 -rc2-40-cbc -rc2-64-cbc
-rc2-cbc -rc2-cfb -rc2-ecb
-rc2-ofb -rc4 -rc4-40
-rc4-hmac-md5 -seed -seed-cbc
-seed-cfb -seed-ecb -seed-ofb
//加密(提供密钥)
$openssl enc -aes-128-cbc -e -K 000 -iv 000 -in test.txt -out test.cipher -a -A -p
//解密
$openssl enc -aes-128-cbc -d -K 000 -iv 000 -in test.ciphet -a -A -out test.plain -p
//加密(提供口令)
$openssl enc -aes-128-cbc -e -pass pass:123456 -S a1bec3d4e5f6 -salt -md sha1 -iv 000 in test.txt -out test.cipher -a -A -p
//解密
$openssl enc -aes-128-cbc -d -pass pass:123456 -S a1bec3d4e5f6 -salt -md sha1 -iv 000 in test.cipher -out test.plain -a -A -p
主要用于数据摘要。它也可以用于数据签名以及验证签名
openssl dgst [-sha|-sha1|-mdc2|-ripemd160|-sha224|-sha256|-sha384|-sha512|-md2|-md4|-md5|-dss1] [-c] [-d] [-hex] [-binary]
[-r][-non-fips-allow] [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify filename]
[-signature filename] [-hmac key] [-non-fips-allow] [-fips-fingerprint] [file...]
注意
例子
//计算摘要
$openssl dgst -sh1 -c -hex -out md.sha1 test.txt
//私钥签名
$ openssl dgst -sign rsa_pri.key -keyform PEM -passin pass:123456 -out rsa_sign.sig test.txt
//私钥验签
$openssl dgst -prverify rsa_pri.key -keyform PEM -passin pass:123456 -signature rsa_sign.sig test.txt
//公钥验签
$openssl dgst -verify rsa_pub.key -keyform PEM -signature rsa_sign.sig test.txt
//hmac
$openssl dgst -hmac rsa_pri.key -keyform PEM -passin pass:123456 -sha1 -out rsa.hmac test.txt
公共密钥算法的参数处理工具。它能够处理公钥或私钥文件。它能够转换组件信息并将它们打印出来。
openssl pkeyparam [-in filename] [-out filename] [-text] [-noout] [-engine id]
$ openssl pkeyparam -in param.pem -text
生成一个私钥。
openssl genpkey [-out filename] [-outform PEM|DER] [-pass arg] [-cipher] [-engine id]
[-paramfile file] [-algorithm alg] [-pkeyopt opt:value][-genparam] [-text]
密钥生成选项——每个算法支持的选项以及算法的每个实现都可以有所不同。 OpenSSL实现的选项如下。
GOST2001密钥生成和参数选项
Gost 2001支持默认情况下不启用。要启用此算法,应在OpenSSL配置文件中加载ccgost引擎。有关详细信息,请参阅源分发引擎/ ccgost directiry中的README.gost文件。 使用GOST R 34.10算法的参数文件是可选的。参数可以在密钥生成期间直接指定,也可以在生成参数文件期间指定。
paramset:name——根据RFC 4357指定GOST R 34.10-2001参数集。参数集可以使用缩写名称,对象短名称或数字OID进行指定。支持以下参数集:
paramset OID Usage
A 1.2.643.2.2.35.1 Signature
B 1.2.643.2.2.35.2 Signature
C 1.2.643.2.2.35.3 Signature
XA 1.2.643.2.2.36.0 Key exchange
XB 1.2.643.2.2.36.1 Key exchange
test 1.2.643.2.2.35.0 Test purposes
//生成RSA私钥
$openssl genpkey -out rsa_pri.key -outform PEM -pass pass:123456 -aes-128-cbc \
-algorithm RSA -pkeyopt rsa_keygen_bits:1024 -text
//这种方式生成的RSA私钥 不仅代用 私钥和大数,还代用公钥,以及其它信息,以用于快速计算。
pkey命令处理公钥或私钥。它们可以在各种形式之间进行转换,并将其结构打印出来。
openssl pkey [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename]
[-passout arg] [-cipher] [-text] [-text_pub] [-noout] [-pubin] [-pubout] [-engine id]
//由私钥生成公钥
$openssl pkey -in rsa_pri.key -inform PEM -passin pass:123456 -out rsa_pub.key -outform PEM -pubout -text
//私钥改密码
$openssl pkey -in rsa_pri.key -inform PEM -passin pass:123456 -out rsa_change.key -outform PEM -passout pass:456789 -des-cbc -text
//改变公钥格式
$openssl pkey -in rsa_pub.key -inform PEM -out rsa_pub_der.key -outform DER -pubin -pubout -text
&emsp pkeyutl命令可用于执行支持的公钥操作.
openssl pkeyutl [-in file] [-out file] [-sigfile file] [-inkey file]
[-keyform PEM|DER] [-passin arg] [-peerkey file] [-peerform PEM|DER] [-pubin]
[-certin] [-rev] [-sign] [-verify] [-verifyrecover] [-encrypt][-decrypt]
[-derive] [-pkeyopt opt:value] [-hexdump] [-asn1parse] [-engine id]
注意:支持的操作和选项根据密钥算法及其实现而有所不同。 OpenSSL操作和选项如下所示。
- 除非另有说明,否则所有算法都支持digest:alg选项,指定摘要算法进行签名,验签和verifyrecover操作。值alg应该是EVP_get_digestbyname()函数中使用的摘要名称,例如sha1。该值仅用于对传入pkeyutl的数据的长度进行健全检查,并用于创建构成签名的结构(例如RSASSA PKCS#1 v1.5签名中的DigestInfo)。在RSA,ECDSA和DSA签名的情况下,该实用程序不会对输入数据执行散列,而是直接使用数据作为签名算法的输入。(因此要注意的输入的数据长度)
- 根据密钥类型,签名类型和填充模式,输入数据的最大可接受长度不同。一般来说,使用RSA,签名数据不能长于密钥模数,在ECDSA和DSA的情况下,数据不应该长于字段大小,否则将被默认地截断为字段大小。换句话说,如果digest的值为sha1,则输入应为SHA-1函数输出的20字节长的二进制编码。
- RSA算法,RSA算法通常支持encrypt,decrypt,sign,verify和verifyrecover操作。一些填充模式只支持其中一些操作
- rsa_padding_mode:mode
- RSA中的参数rsa_padding_mode:mode设置RSA的填充模式,支持的填充模式有:用PKCS#1来设置PKCS#1填充模式,用sslv23来设置SSLv23填充模式,用none来设置no填充模式,用oaep来设置OAEP填充模式,用x931来设置X9.31填充模式以及用pss来设置PSS。
- 在PKCS#1填充中,如果摘要算法未设置,则提供的数据将被直接签名或验证,而不是使用DigestInfo结构。如果设置摘要,则使用DigestInfo结构,其长度必须对应于摘要类型。
- 对于oeap模式,仅支持加密和解密。
- 对X9.31填充模式来说,如果设置了摘要算法,并将它用于格式块数据,否则第一个字节必须要用X9.31摘要ID。它支持签名、验证签名以及验证恢复操作。
- 对于pss模式,仅支持签名和验证,并且必须指定摘要算法
- rsa_pss_saltlen:LEN
- 对于pss模式,只有此选项指定填充长度。它支持两个值:
- -1设置填充长度为摘要长度。
- -2表示当签名的时候,设置填充字节为最大的可允许的字节数。当验证的时候,表示填充字节由块结构体来决定。
- DSA算法——DSA算法仅支持sign和verify操作。 目前除了digest之外没有其他选项。 默认情况下,只能使用SHA1摘要,并默认此摘要算法。
- DH算法—— DH算法只支持derived操作,没有附加选项。
EC算法——EC算法支持sign,verify和derived操作。 sign和verify操作使用ECDSA,derived使用ECDH。 目前除了digest之外没有其他选项。 只支持SHA1摘要,默认摘此要算法 。
举列
//签名
$openssl pkeyutl -sign -inkey rsa_pri.key -keyform PEM -passin pass:123456 -in md.sha1 -out md.sig
//验签
$openssl pkeyutl -verify -inkey rsa_pub.key -keyform PEM -pubin -in md.sha1 -sigfile md.sig
//加密
$openssl pkeyutl -encrypt -inkey rsa_pub.key -keyform PEM -pubin -in md.sha1 -out md.cipher
//解密
$openssl pkeyutl -decrypt -inkey rsa_pri.key -keyform PEM -passin pass:123456 -in md.cipher -out md.plain
//创建一个共享密钥
$openssl pkeyutl -derive -inkey rsa_pri.pem -passin pass:123456 -peerkey pubkey.pem -out secret
req命令主要创建证书请求(可以新生成私钥),查看证书请求。它可以创建自签名证书,以作为root CA使用。但不能读取证书。
openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg]
[-out filename] [-passout arg] [-text] [-pubkey] [-noout] [-verify][-modulus]
[-new] [-rand file(s)] [-newkey arg] [-nodes] [-key filename] [-keyform PEM|DER]
[-keyout filename][-keygen_engine id] [-[digest]] [-config filename] [-multivalue-rdn]
[-x509] [-days n] [-set_serial n] [-asn1-kludge] [-no-asn1-kludge] [-newhdr]
[-extensions section] [-reqexts section] [-utf8] [-nameopt] [-reqopt]
[-subject] [-subj arg] [-batch] [-verbose] [-engine id]
证书签名
显示选项
配置文件格式
- 配置选项在配置文件的req部分中指定。与所有配置文件一样,如果在特定部分(即req)中未指定任何值,则使用默认值。
- input_password output_password ——输入私钥文件(如果存在)和输出私钥文件(如果将被创建)的口令。命令行选项passin和passout覆盖此值。
- default_bits—— 指定默认密钥大小(以位为单位)。 此选项与-new选项结合使用以生成新密钥。可以通过在-newkey选项中指定密钥大小来覆盖它。最小的接受密钥大小是512位。如果没有指定密钥大小,则使用2048位。
- default_keyfile—— 这是将私钥输出时的默认文件名。如果未指定,则将该键写入标准输出。这可以被-keyout选项覆盖。
- oid_file——指定一个包含其他对象标识符的文件。文件的每一行都应包含对象标识符的数字形式,后跟空格,然后是短名称,后跟空格,最后是长名称。。
- oid_section——指定配置文件中包含额外对象标识符的部分。每一行都应包含对象标识符的短名称,后面跟着=和数字形式。当使用此选项时,短名称和长名称相同。
- RANDFILE—— 这指定了放置和读取随机数种子信息或EGD套接字的文件名(请参阅RAND_egd)。它用于私钥生成。
- encrypt_key——如果这被设置为否,则如果生成私钥,则不加密。这相当于-nodes命令行选项。为了兼容性,encrypt_rsa_key是一个等效的选项。
- default_md——此选项指定要使用的摘要算法。可能的值包括md5 sha1 mdc2。如果不存在,则使用MD5。该选项可以在命令行中被覆盖。
- string_mask—— 此选项会遮蔽某些字段中某些字符串类型的使用。大多数用户不需要更改此选项。它可以设置默认值,默认选项使用PrintableStrings,T61Strings和BMPStrings,如果设置为pkix,则只能使用PrintableStrings和BMPStrings。这符合RFC2459中的PKIX建议。如果设置utf8only,则仅使用UTF8Strings:这是2003年之后的RFC2459中的PKIX建议。最后,设置为nombstr仅使用PrintableStrings和T61Strings:某些软件在BMPStrings和UTF8Strings中有问题:特别是Netscape。
- req_extensions——它指定了配置文件中字节包含了一系列的额外信息,这些额外信息将会被添加到证书请求信息中。它可以被-reqexts命令覆盖。有关详细信息,请参阅x509v3_config(5)。
- x509_extensions 它指定了配置文件中字节包含了一系列的扩展信息,当-x509选项使用时,这些额外信息将会被添加到证书中。它可以被- extensions命令行所覆盖。
- prompt——如果设置为值no,则禁用提示字段,并直接从配置文件获取值。它还会更改distinguished_name和attributes部分的预期格式。
- utf8—— 如果设置为yes,则域的值将转换为utf8格式。默认的是ASCII格式。这就意味着这些域值不能从终端获取值,只能从配置文件中获取,还必须是可利用的UTF8字符串。
- attributes——这个指定了包含很多请求属性的字节:格式和distinguished_name一样。具有代表性的是包含challengePassword 或 unstructuredName 类型。目前来说,他们是被OpenSSL的请求签名实体所忽略了的,但是一些CA有可能需要他们。
- distinguished_name——这个指定了包含distinguished_name域,当产生一个证书或证书请求时,有提示。
- 注意:PEM格式的页眉和页脚线通常为:
—–BEGIN CERTIFICATE REQUEST—–
—–END CERTIFICATE REQUEST—–
某些软件(某些版本的Netscape证书服务器)需要:
—–BEGIN NEW CERTIFICATE REQUEST—–
—–END NEW CERTIFICATE REQUEST—–
它使用-newhdr选项生成,但以其他方式兼容。 任何形式的输入都被透明地接受。
Xenroll与MSIE生成的证书请求已添加扩展名。 它包括keyUsage扩展,它决定了密钥的类型(仅限签名或通用目的)以及脚本在extendedKeyUsage扩展中输入的任何其他OID。- distinguished_name和 attributes格式
- 有两种单独的格式。如果 prompt选项设置为否,则这些部分仅由字段名称和值组成, 这允许外部程序(例如基于GUI)生成具有所有字段名称和值的模板文件,并将其传递给req:例如,
CN=My Name
OU=My Organization
[email protected]- 或者,如果提示选项不存在或未设置为否,则该文件包含字段提示信息。它由以下形式组成:
fieldName=”prompt”
fieldName_default=”default field value”
fieldName_min= 2
fieldName_max= 4
- ”fieldName”是正在使用的字段名称,例如commonName(或CN)。 “提示”字符串用于要求用户输入相关详细信息。如果用户没有输入任何内容,那么如果没有默认值,则使用默认值,r如果没有默认值则省略该字段。如果用户刚刚输入’.’,即使存在默认值,仍然可以省略一个字段。
- 输入的字符数必须在fieldName_min和fieldName_max限制之间:根据正在使用的字段可能会有其他限制(例如,countryName只能长两个字符,并且必须适合PrintableString)。
- 某些字段(如organizationName)可以在DN中多次使用。 这是一个问题,因为配置文件将不会识别出现两次相同的名称。 为了避免这个问题,如果fieldName包含一些字符后跟一个完整的停止将被忽略。 所以第二个organizationName可以通过调用“1.organizationName”来输入。
- 实际上所许可的域名字是一些对象标识符的短或长名字。它们在OpenSSL中编译和包含常用的值例如as commonName、countryName、localityName、 organizationName、organizationUnitName、stateOrProvinceName。此外emailAddress也包含name、 surname、givenName initials 和 dnQualifier。
- 可以使用配置文件中的oid_file或oid_section选项来定义附加对象标识符。 任何其他字段将被视为一个DirectoryString。
诊断
经常询问以下消息:
Using configuration from /some/path/openssl.cnf
Unable to load config info
在一段时间后跟…
unable to find ‘distinguished_name’ in config
problems making Certificate Request
第一个错误信息是线索:找不到配置文件!某些操作(如检查证书请求)不需要配置文件,因此不会强制使用它。然而生成证书或请求确实需要一个配置文件。这可以被认为是一个bug。
另一个令人困惑的消息是:
Attributes:
a0:00
当没有属性存在并且该请求包括正确的空的SET OF结构(其DER编码为0xa0×0x00)时显示。如果你只是看到: Attributes:
那么SET OF丢失,编码在技术上是无效的(但是它是容忍的)。有关详细信息,请参阅命令行选项-asn1-kludge的说明。
环境变量
如果定义了变量OPENSSL_CONF,则允许指定备用配置文件,它将被-config选项覆盖(如果存在)。出于兼容性原因,SSLEAY_CONF环境变量用于相同的用途,但不鼓励使用它。
BUGS
OpenSSL处理T61Strings(又名TeletexStrings)是坏的:它将它们视为ISO-8859-1(拉丁文1),Netscape和MSIE具有相似的行为。如果你需要的字符是PrintableStrings中不可用的字符,并且您不想使用或不能使用BMPStrings,则可能会导致问题。
作为T61String处理的结果,在OpenSSL中唯一正确的表示重音字符的方法是使用BMPString:不幸的是Netscape当前对这些字符进行调整。如果您必须使用Netscape和MSIE重音字符,那么您当前需要使用无效的T61String格式。
目前的提示不是很友好。它不允许您确认您刚刚输入的内容。在配置文件中静态定义了证书请求中的其他扩展。其中一些:像subjectAltName中的电子邮件地址应由用户输入。
例子
//验证证书请求
$openssl req -verify -in root.req -text -noout -pubkey -modulus -subject
//创建一个私钥,并用其生成一个证书请求
$openssl genpkey -out rsa_pri.key -outform PEM -pass pass:123456 -aes-128-cbc \
-algorithm RSA -pkeyopt rsa_keygen_bits:1024
$openssl req -new -key rsa_pri.key -inform PEM -passin pass:123456 -out root.req -subj
/CN=china/OU=test/O=abc/CN=forxy
//等效于
$ openssl req -newkey rsa:1024 -keyout new_rsa_pri.key -outform PEM -passout pass:123456 -out root.req -subj /CN=china/OU=test/O=abc/CN=forxy
//产生一个自签名的根证书,不提供私钥
$openssl req -x509 -set_serial 10001 -days 10 -subj /CN=china -newkey rsa:1024 -keyout new_rsa_pri.pkey -outform PEM -passout pass:123456 -out root_new.cer -outform PEM
//产生一个自签名的根证书,提供私钥
$openssl req -x509 -set_serial 10001 -days 10 -key rsa_pri.pem -keyform PEM -passin pass:123456 -in root.req -inform PEM -out root.cer -outform PEM
//oid_file选项指定的文件
1.2.3.4 shortName A longer Name
1.2.3.6 otherName Other longer Name
//oid_section指定的文件
testoid1=1.2.3.5
testoid2=${testoid1}.6
//带提示的配置文件
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca
dirstring_type = nobmp
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = AU
countryName_min = 2
countryName_max = 2
localityName = Locality Name (eg, city)
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (eg, YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 40
[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints = CA:true
// 包含所有字段的配置文件
RANDFILE = $ENV::HOME/.rnd
[ req ]
default_bits = 2048
default_keyfile = keyfile.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
prompt = no
output_password = mypass
[ req_distinguished_name ]
C = GB
ST = Test State or Province
L = Test Locality
O = Organization Name
OU = Organizational Unit Name
CN = Common Name
emailAddress = [email protected]
[ req_attributes ]
challengePassword = A challenge password
本指令是一个功能很丰富的证书处理工具。可以用来显示证书的内容,转换证书格式,给证书请求签名,也可自签根证书等等。由于功能太多,我们按功能分成几部分来讲。
openssl x509 [-inform DER|PEM|NET] [-outform DER|PEM|NET] [-keyform DER|PEM]
[-CAform DER|PEM] [-CAkeyform DER|PEM] [-in filename] [-out filename][-serial] [-hash]
[-subject_hash] [-issuer_hash] [-ocspid] [-subject] [-issuer] [-nameopt option]
[-modulus] [-pubkey] [-fingerprint] [-alias] [-noout] [-trustout] [-clrtrust]
[-clrreject] [-addtrust arg][-addreject arg] [-setalias arg] [-days arg] [-set_serial n]
[-signkey filename] [-passin arg] [-x509toreq] [-req] [-CA filename] [-CAkey filename]
[-CAcreateserial] [-CAserial filename] [-force_pubkey key] [-text] [-certopt option]
[-C] [-md2|-md5|-sha1|-mdc2] [-clrext] [-extfile filename] [-extensions section]
[-engine id]
//自签证书
$openssl x509 -req -signkey rsa_pri.key -keyform PEM -passin pass:123456 -in root.req -inform PEM -out root.cer -outform PEM
//签发用户证书
$openssl x509 -req -set_serial 00001 -days 100 -CA root.cer -CAform PEM -CAkey rsa_pri.key -CAkeyform PEM -passin pass:123456 -in user.req -inform PEM -out user.cer -outform PEM
//解析证书完整信息
$openssl x509 -in user.cer -inform PEM -text -noout
//查看证书指定信息
$openssl x509 -in user.cer -inform PEM -noout -pubkey -modulus -serial -subject -issuer -email -startdate -enddate -dates -fingerprint -subject_hash -issuer_hash -subject_hash_old -issuer_hash_old
//以C源码输出证书
$openssl x509 -in user.cer -inform PEM -out user.infor -C
//转换证书格式
$openssl x509 -in user.cer -inform PEM -out user.der -outform DER
//查看证书用途
$openssl x509 -purpose -noout -in user.cer
用于验证证书链。
openssl verify [-CApath directory] [-CAfile file] [-purpose purpose] [-policy arg]
[-crl_check] [-crl_check_all] [-policy_check] [-explicit_policy] [-inhibit_any] [-inhibit_map] [-x509_strict][-extended_crl] [-use_deltas] [-policy_print] [-no_alt_chains] [-untrusted file] [-help] [-issuer_checks] [-trusted file] [-verbose] [-] [certificates]
pkcs7处理DER或者PEM格式的pkcs#7文件
openssl pkcs7 [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-out filename]
[-print_certs] [-text] [-noout] [-engine id]
注意:
The PEM PKCS#7 format uses 头部和尾部:
-----BEGIN PKCS7-----
-----END PKCS7-----
还有一种可兼容的格式:
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
//把一个PKCS#7文件从PEM格式转换成DER格式:
$openssl pkcs7 -in pk7.pem -outform DER -out pk7.der
//打印文件所有证书
$openssl pkcs7 -in pk7.pem -print_certs -out certs.pem
pkcs8命令处理PKCS#8格式的私钥。它可以使用各种PKCS#5(v1.5和v2.0)和PKCS#12算法来处理未加密的 PrivateKeyInfo格式的和已加密的PrivateKeyInfo格式 的PKCS#8。
openssl pkcs8 [-topk8] [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg]
[-out filename] [-passout arg] [-noiter] [-nocrypt][-nooct] [-embed] [-nsdb] [-v2 alg]
[-v2prf alg] [-v1 alg] [-engine id]
-v1 alg——此选项指定要使用的PKCS#5 v1.5或PKCS#12算法。 下面列出了可能的算法的完整列表。
注意
PEM编码PKCS#8文件的加密形式使用以头部和尾部:
—–BEGIN ENCRYPTED PRIVATE KEY—–
—–END ENCRYPTED PRIVATE KEY—–
未加密的使用:
—–BEGIN PRIVATE KEY—–
—–END PRIVATE KEY—–
使用PKCS#5 v2.0算法和高迭代次数加密的私钥比那些使用传统SSLeay兼容格式加密的私钥更安全。因此,如果安全性被认为是重要的,则应转换密钥。
标准
//pkcs#1私钥生成pkcs8的私钥
$openssl pkcs8 -topk8 -in rsa_pri.key -inform PEM -passin pass:123456 -out rsa_pri.pk8 -outform PEM -passout pass:123456 -v2 des3
//pkcs8的私钥生成pkcs#1私钥
$openssl pkcs8 -in rsa_pri.pk8 -inform PEM -passin pass:123456 -out rsa_pri.key -outform PEM -passout pass:123456 -v2 des3
pkcs12工具,能生成和分析pkcs12,也叫pfx文件。PKCS#12文件可以被用于多个程序,例如包含Netscape、 MSIE 和 MS Outlook。
openssl pkcs12 [-export] [-chain] [-inkey filename] [-certfile filename] [-name name]
[-caname name] [-in filename] [-out filename] [-noout] [-nomacver] [-nocerts] [-clcerts]
[-cacerts] [-nokeys] [-info]
[-des | -des3 | -idea | -aes128 | -aes192 | -aes256| -camellia128 | -camellia192 | -camellia256 | -nodes]
[-noiter] [-maciter | -nomaciter | -nomac][-twopass] [-descert] [-certpbe cipher]
[-keypbe cipher] [-macalg digest] [-keyex] [-keysig] [-password arg] [-passin arg]
[-passout arg] [-rand file(s)][-CAfile file] [-CApath dir] [-CSP name]
old-openssl -in bad.p12 -out keycerts.pem
openssl -in keycerts.pem -export -name“我的PKCS#12文件”-out fixed.p12
$openssl pkcs12
smime命令处理S / MIME邮件。它可以加密,解密,签名和验证S / MIME消息
openssl smime [-encrypt] [-decrypt] [-sign] [-resign] [-verify] [-pk7out] [-[cipher]]
[-in file] [-no_alt_chains] [-certfile file] [-signer file] [-recip file]
[-inform SMIME|PEM|DER] [-passin arg] [-inkey file] [-out file] [-outform SMIME|PEM|DER]
[-content file] [-to addr] [-from ad] [-subject s] [-text] [-indef] [-noindef] [-stream]
[-rand file(s)] [-md digest] [cert.pem]...
声明:OpenSSL之命令行详解是根据卢队长发布在https://blog.csdn.net/as3luyuan123/article/details/16105475的系列文章整理修改而成,我自己所做的工作主要是针对新的1.0.2版本进行验证,修改错别字,和错误,重新排版,以及整理分类,配图。 未经作者允许,严禁用于商业出版,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!