避免密码提示密钥和 DN 信息提示

98 prompt openssl ssl-certificate x509

我正在使用以下代码生成密钥:

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
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 如何跳过密码提示?我这样做是否相当安全?(因为它不应该是彻头彻尾的愚蠢,因为任何人都应该能够破解证书)

  2. 如何避免提示输入国家/地区名称、组织等。我希望我可以在命令提示符下提供它们(手册页仅显示 OpenSSL 的顶级选项)

bah*_*mat 167

编辑:这是迄今为止我最受欢迎的答案,现在已经有几年了,所以我添加了一个 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

所有 openssl 子命令都有自己的手册页。见man req


专门解决您的问题,并更明确地说明哪些选项有效:

  1. -nodes标志表示不加密密钥,因此您不需要密码。您也可以使用-passout arg标志。有关如何格式化 arg 的信息PASS PHRASE ARGUMENTS,请参见openssl(1)手册页。

  2. 使用该-subj标志,您可以指定主题(示例如上)。

  • 通过“-subj”读取东西效果很好,但是 - 对我来说 - 只有当 OPENSSL_CONF 没有设置时。IOW:如果设置了 OPENSSL_CONF,OpenSSL 将尝试从那里读取,并 _ignore_ "-subj" 命令行参数。我花了一段时间才弄清楚。 (3认同)
  • @jww - 那个时候到了。从 Chrome v58 开始,当尝试加载安全页面但证书不包含匹配的 subjectAltName 时,它​​会显示带有错误消息“NET::ERR_CERT_COMMON_NAME_INVALID”的隐私错误页面。单击高级按钮会显示消息“...它的安全证书来自 [missing_subjectAltName]” (2认同)

900*_*000 12

-passin选择做把戏吗?

使用file:pathname表单,您可以非常安全地使用该文件的权限 600。


And*_*ura 6

接受的答案需要一些小的更正。欧共体线路:

-newkey ec
-pkeyopt ec_paramgen_curve:prime256v1
Run Code Online (Sandbox Code Playgroud)

应该:

 -newkey ec \
 -pkeyopt ec_paramgen_curve:prime256v1 \
Run Code Online (Sandbox Code Playgroud)

在 MacOS 上 - 通过 brew 安装的 OpenSSL 1.0.2f 我验证了接受的答案,如下所述