尝试使用RHEL上的openssl实现一种自签名的PKI设置,但有一些注意事项。我将尝试在此提供尽可能多的信息。
版本:RHEL 6.7 | OpenSSL 1.0.1e-fips 2013年2月11日
脚本上的注意事项/约束:此脚本将用于创建多个密钥集 - 默认情况下,每个运行一个根密钥对和证书以及两个客户端密钥对和证书。要求用户输入客户端密钥上的文件位置,文件名和密码。所有这些都相当简单,我有一个脚本可以根据用户请求运行这些命令,并利用openssl.cnf文件指回根键进行签名。我曾经使用sed来改变openssl.cnf中基于文件名的位置指针,并且成功地能够签署客户端证书。
但是,有两个主要的注意事项:
我被要求更改脚本,以便每次运行时动态不是脚本或其他文件,这意味着如果可能的话,不应该动态编辑openssl.cnf。如果需要这样做,那么它应该没问题。
用户需要能够临时运行多个此脚本集,尤其是关于客户端密钥对(我在用户可选菜单中将根脚本和客户端生成脚本分开)。也就是说,生成客户端密钥对是必需的,有一个根密钥可以关联,但可以多次完成,客户端密钥脚本应该询问用户与哪个根密钥关联并签名?
由于存在这些限制,编辑openssl.cnf似乎是一个谨慎的选择,并且不具备可扩展性。所以,鉴于这个信息,我一直无法弄清楚的问题只是:
有没有办法将客户端密钥指向一个变量,该变量将成为要签名的根密钥证书? (而不是使用openssl.cnf获取'证书' private_key'条目?)
截至目前,我有:
root key&证书:
openssl req -config $dir/openssl.cnf -new -x509 -days 3652 -nodes -sha384 -newkey ec:ec-secp384r1.pem -keyout $userdir/${rootName}_private.key -out $userdir/${rootName}.crt -subj "stuff_here"
...
export rootName
客户端密钥&证书:
read -p "Which root key do you want to associate this client keypair with? Please type absolute filepath and filename (ending in .key); rkAssoc #STILL NEED TO USE THIS VARIABLE
##KEY GENERATION
openssl req -newkey ec:ec-secp384rp1.pem -keyout $userdir/{$clientName}_privat.key -out $userdir/client/${clientName}.csr -subj "Stuff_here"
##SIGN CSR
openssl ca -config $dir/openssl.cnf -policy policy_anything -extensions usr_cert -days 730 -notext -md sha384 -in $userdir/client/${clientName}.csr -out $userdir/client/${clientName}_signedprivatekey.pem && echo "Client key created."
所以我想,
1)我是否正确地进行了客户端签名(有些事情似乎有些不确定)
2)而不是引用-req openssl.cnf我认为可能存在某种旗帜,你可以做更像的事情
openssl ca ... -cert ${rkAssoc}
这是远程正确还是我离开了?
提前感谢任何伸出援助之手的人。
答案 0 :(得分:1)
OpenSSL有多种方法可以做同样的事情。您找到了一种使用openssl ca
签署CSR的方法。 openssl x509
可以充当迷你CA,因此为了消除对配置文件的需求,您可以执行以下操作:
openssl x509 -req -in /tmp/mykey.csr.pem -CA /path/to/ca/mycacert.pem -CAkey /path/to/ca/cakey engine -CAserial /path/to/ca/myca.srl -days 3600 -out /tmp/mykeypub.cert.pem
其中-CA
指向根CA证书,-CAkey
指向根CA密钥。