我正在使用以下代码来生成密钥:
apt-get -qq -y install openssl;
mkdir -p /etc/apache2/ssl;
openssl genrsa -des3 -out server.key 1024;
openssl req -new -key server.key -out server.csr;
cp server.key server.key.org;
openssl rsa -in server.key.org -out server.key;
openssl x509 -req -days 12000 -in server.csr -signkey server.key -out server.crt;
mv server.crt /etc/apache2/ssl/cert.pem;
mv server.key /etc/apache2/ssl/cert.key;
rm -f server.key.orig;
rm -f server.csr
我有两个问题:
我如何跳过密码提示?这样做是否安全?(因为这并不愚蠢,就像任何人都可以破解证书一样)
我如何避免提示国家名称、组织等。我希望我可以在命令提示符下提供它们(手册页仅显示 OpenSSL 的顶级选项)
答案1
编辑:这是迄今为止我最受欢迎的答案,现在已经过去了几年,所以我添加了 ECDSA 变体。如果你可以使用 ECDSA,那么就应该使用。
您可以在命令行上提供所有这些信息。
一步式自签名无密码证书生成:
RSA 版本
openssl req \
-new \
-newkey rsa:4096 \
-days 365 \
-nodes \
-x509 \
-subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
-keyout www.example.com.key \
-out www.example.com.cert
ECDSA 版本
openssl req \
-new \
-newkey ec \
-pkeyopt ec_paramgen_curve:prime256v1 \
-days 365 \
-nodes \
-x509 \
-subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
-keyout www.example.com.key \
-out www.example.com.cert
所有 openssl 子命令都有自己的手册页。请参阅man req
。
具体回答您的问题,并更明确地说明哪些选项有效:
该
-nodes
标志表示不加密密钥,因此您不需要密码。您也可以使用该-passout arg
标志。请参阅PASS PHRASE ARGUMENTS
在openssl(1)
手册页中了解如何格式化参数。使用
-subj
标志您可以指定主题(示例如上)。
答案2
-passin
这个选项对你来说还不够吗?
使用file:pathname
表单,您可以非常安全地使用该文件的权限 600。
答案3
接受的答案需要做一些小的修正。EC 行:
-newkey ec
-pkeyopt ec_paramgen_curve:prime256v1
应该:
-newkey ec \
-pkeyopt ec_paramgen_curve:prime256v1 \
在 MacOS - 通过 brew 安装的 OpenSSL 1.0.2f 上,我验证了接受的答案,如下所述
列出可用的椭圆曲线:
$ openssl ecparam -list_curves
要生成密钥文件:
$ openssl ecparam -name secp256k1 -out secp256k1.pem
要生成没有密码提示的证书:
openssl req \ -new \ -newkey ec:secp256k1.pem \ -days 365 \ -nodes \ -x509 \ -subj "/C=US/ST=FL/L=Ocala/O=Home/CN=example.com" \ -keyout server.key \ -out server.crt
查看证书:
$ openssl x509 -noout -text -in server.crt
答案4
@bahamat 的回答很棒。不幸的是,某些版本的 openssl 在尝试使用一个命令创建 ECDSA 证书时会抛出错误。错误内容如下:
routines:EVP_PKEY_CTX_ctrl:invalid operation:pmeth_lib.c:404
我正在openssl 1.0.1e-fips
使用CentOS 7
。
使用以下 3 个命令创建证书似乎有效:
openssl ecparam -genkey -name prime256v1 -out key.pem
openssl req -new -key key.pem -out csr.pem -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"
openssl req -x509 -days 365 -key key.pem -in csr.pem -out certificate.pem