OpenSSL 是一个开源项目,其组成主要包括一下三个组件:
- openssl:多用途的命令行工具
- libcrypto:加密算法库
- libssl:加密模块应用库,实现了ssl及tls
1、对称加密
对称加密需要使用的标准命令为 enc ,用法如下:
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]
常用选项有:
-in filename:指定要加密的文件存放路径
-out filename:指定加密后的文件存放路径
-salt:自动插入一个随机数作为文件内容加密,默认选项
-e:可以指明一种加密算法,若不指的话将使用默认加密算法
-d:解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致
-a/-base64:使用-base64位编码格式
示例 加密:openssl enc -e -des3 -a -salt -in fstab -out fstab.des3 解密:openssl enc -d -des3 -a -salt -in fstab.des3 -out fstab 2、单向加密 单向加密需要使用的标准命令为 dgst ,用法如下: 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...] [root@shitouji shitou]# openssl dgst -md5 test.txt > a [root@shitouji shitou]# cat a MD5(test.txt)= f19eb8db94696d22661367d5c8d8cad7
3、生成密码
生成密码需要使用的标准命令为 passwd ,用法如下:
openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
常用选项有:
-1:使用md5加密算法
-salt string:加入随机数,最多8位随机数
-in file:对输入的文件内容进行加密
-stdion:对标准输入的内容进行加密
默认是加了salt的,如果没有指定,salt值是随机的,所以即使密码一样,生成的加密也是不一样的
4、生成随机数
生成随机数需要用到的标准命令为 rand ,用法如下:
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
常用选项有:
-out file:将生成的随机数保存至指定文件中
-base64:使用base64 编码格式
-hex:使用16进制编码格式
[root@shitouji shitou]# openssl rand -base64 10 -out test.txt
[root@shitouji shitou]# cat test.txt
5、生成秘钥对
首先需要先使用 genrsa 标准命令生成私钥,然后再使用 rsa 标准命令从私钥中提取公钥。
genrsa 的用法如下:
openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
常用选项有:
-out filename:将生成的私钥保存至指定的文件中
-des|-des3|-idea:不同的加密算法
numbits:指定生成私钥的大小,默认是2048
一般情况下秘钥文件的权限一定要控制好,只能自己读写,因此可以使用 umask 命令设置生成的私钥权限,示例如下:
ras 的用法如下:
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]
常用选项:
-in filename:指明私钥文件
-out filename:指明将提取出的公钥保存至指定文件中
-pubout:根据私钥提取出公钥
6、CA和证书
最主要的步骤:生成一对密钥和自签署证书
生成私钥
[root@shitouji CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
生成公钥
openssl req用来生成自签证书
主要命令选项:
-new :说明生成证书请求文件
-x509 :说明生成自签名证书
-key :指定已有的秘钥文件生成秘钥请求,只与生成证书请求选项-new配合。
-newkey :-newkey是与-key互斥的,-newkey是指在生成证书请求或者自签名证书的时候自动生成密钥,
然后生成的密钥名称由-keyout参数指定。[-newkey rsa:bits]当指定newkey选项时,后面指定rsa:bits说明产生
rsa密钥,位数由bits指定。 如果没有指定选项-key和-newkey,默认自动生成秘钥。
-out :-out 指定生成的证书请求或者自签名证书名称
-config :默认参数在ubuntu上为 /etc/ssl/openssl.cnf, 可以使用-config指定特殊路径的配置文件
-nodes :如果指定-newkey自动生成秘钥,那么-nodes选项说明生成的秘钥不需要加密,即不需要输入passphase.
-text :以文本的方式读取证书信息
-batch :指定非交互模式,直接读取config文件配置参数,或者使用默认参数值
[root@shitouji CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem #申请自签证书
[root@shitouji CA]#touch index.txt #创建一个index.txt
openssl.cnf配置文件主要说明
dir = /etc/pki/CA /* Where everything is kept */ /* #### 这是第一个openssl目录结构中的目录 */ certs = $dir/certs /* Where the issued certs are kept(已颁发的证书路径,即CA或自签的) */ /* #### 这是第二个openssl目录结构中的目录,但非必须 */ crl_dir = $dir/crl /* Where the issued crl are kept(已颁发的crl存放目录) */ /* #### 这是第三个openssl目录结构中的目录*/ database = $dir/index.txt /* database index file */ #unique_subject = no /* 设置为yes则database文件中的subject列不能出现重复值 */ /* 即不能为subject相同的证书或证书请求签名*/ /* 建议设置为no,但为了保持老版本的兼容性默认是yes */ new_certs_dir = $dir/newcerts /* default place for new certs(将来颁发的证书存放路径) */ /* #### 这是第四个openssl目录结构中的目录 */ certificate = $dir/cacert.pem /* The A certificate(CA自己的证书文件) */ serial = $dir/serial /* The current serial number(提供序列号的文件)*/
1、问题描述:做证书签证时出现下面问题
sudo openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
The mandatory stateOrProvinceName field was missing
2、出现原因:openssl.cnf中CA policy有三个match,必须要填一样的,或者改成optional
3、解决方法:修改配置文件,修改后为:
# For the CA policy
[ policy_match ]
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional