完成基础理论的梳理后,我们首要的就是要进行一系列证书相关操作,为后续的开发做准备,这里主要描述证书操作的几种常规和常用操作,如:申请证书,自签发放证书,合成pfx等。
本文主要是通过工具对证书相关的操作进行收集和整理,主选工具为openssl这个比较通用写,关于keytool的操作,因为只是java首选,我们放一下。
申请证书
申请证书是最常用的证书相关操作,一般网站需要向CA及代理机构申请证书时,我们需要先进行一些操作,然后提交相关资料和文件给CA机构,待缴钱钱和处理后,CA在发放对应的证书回来。
前文理论部分介绍过,证书是CA机构对我们的实体信息及公钥的签名证明文件,所以我们申请证书时,需要提交我们的实体信息及公钥给CA机构,怎么提交的,业界一般采用生成一种叫CSR的文件提交给CA机构。
CSR是Cerificate Signing Request的英文缩写,即证书请求文件,也就是证书申请者在申请数字证书时由CSP(加密服务提供者, 就是自己通过openssl生成的)在生成私钥的同时也生成证书请求文件,证书申请者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。 通常CSR文件是在拿到参考码、授权码进行证书签发和下载时,通过网页提交给CA的。
怎么做!?我们以openssl为例介绍如下:
- 创建公私秘钥对
前面理论介绍过,目前证书相关技术和操作的核心其实是非对称加密,所以生成证书前,我们先生成一对非对称秘钥对。
# 创建一个1024位(1024/8=256字节)长度秘钥,如果觉得不安全可以使用2048,但是速度回慢很多。
openssl genrsa -out private.pem 1024
# (可选)生成私钥对应的公钥,其实不必要,因为可以直接生成证书请求文件,然后拿到证书后,证书里面就有对应的公钥。为了看起舒服,先生成一个阔来。
openssl rsa -in private.pem -pubout -out public.pem
OK,上面命令成功后,当前目录就有了2个文件: private.pem和public.pem
- 生成证书申请文件CSR
# 直接使用签名的私钥生成对应的证书申请请求文件,请根据提示设置实体信息及保护密码
openssl req -new -out server.csr -key private.pem
注意:
- 需要依次输入国家,地区,组织,email。最重要的是有一个common name,可以写你的名字或者域名。如果为了网站申请https,这个必须和域名吻合(可以支持泛域名),否则会引发浏览器警报。
- 如果你准备后续使用直接生成的CA证书(ca.cer,请参考后续节点说明)自签名发放证书,注意这里的组织名称(O)与ca.cer的组织名称设置一致,否则会提示错误。
OK,该不是完成后,就会生成一个server.csr文件,请提交该文件个CA机构并缴钱钱,然后等CA完成后发放证书给你~ 如果你下自己发放一个自签名证书,请继续~~
自签名证书发放
在开发和测试相关应用的时候,我们一般还没有申请正式的CA证书,所以,一般情况下,我们会使用自己先制造一个CA的根证书和私钥来作为CA身份,然后在对我们的证书申请文件进行签名生成自签名的证书。
接上节中生成的CRS文件:server.csr
- 生成CA证书及秘钥
# 通过命令直接生成一个CA的证书及私钥,用于后续直签名证书生成
openssl req -new -x509 -keyout ca.key -out ca.cer
成功后,生成2个文件。ca.cer为证书文件; ca.key为pem编码的私钥。
- 生成自签名证书
使用上面生成的CA证书和私钥,对CSR文件生成我们的自签名证书。
openssl ca -in server.csr -out server.cer -cert ca.cer -keyfile ca.key
这里如果出现错误:I am unable to access the ./demoCA/newcerts directory./demoCA/newcerts: No such file or directory,则需要处理:
- 在当前目录建立 demoCA/newcerts目录
- 创建空文件:demoCA/index.txt
- 创建文件:demoCA/serial,并首行写入01,第二行空一行。
或者,请修改下openssl.conf里面对应的CA Default配置段。
OK,成功后,输出我们的证书文件:server.cer
至此,我们已经获得了证书文件server.cer, 无论你是从CA申请的还是自签名的,我们都完成了。你可以使用该文件去配置你web服务器的https访问了,例如:apache/nginx等。
合成pfx文件
如果你面临一个case,需要使用非对称加密来完成与你客户之间数据的通讯和签名,但是因成本考虑,你们都没有购买专业授信的加密机(秘钥不落地), 而你的客户也并没有管理和维护证书的成本考虑,那么比较合适的方案是:你采用文件方式管理和发放证书给你的客户,并交换你们的公钥,然后加密数据在传输。
你准备怎么给你的客户发放证书呢?!当然你需要为客户生成证书,同时发放对应的私钥给你的客户,我们一般采用keystore的方式交互给对方。常用的有jks和pkcs12(pfx)两种方式,其中pfx比较通用,jks一般是java体系使用。
现在我们,假设前面生产的证书及对应私钥就是为客户生成,并准备发放给客户的,那么我们现在需要把证书和私钥合成为pfx文件,并设置一个保护密码,然后再交付给客户。
- 生成pkcs12文件,但不包含CA证书:
openssl pkcs12 -export -inkey private.pem -in server.cer -out server.pfx
- 生成pkcs12文件,包含CA证书:
openssl pkcs12 -export -inkey private.pem -in server.cer -CAfile ca.cer -chain -out server.pfx
OK, 我们为客户生成了server.pfx,现在可以交付给客户了,如果你设置了保护密码,请记得告诉他密码。同时不要忘记交付给他你的公钥,否则无法加密发送的数据~