避免输入密码提示键和提示DN信息


90

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

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

我有两个问题:

  1. 如何跳过密码提示?对我来说这样做安全吗?(因为它不应像任何人都应该能够破解证书那样彻头彻尾的愚蠢)

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

Answers:


150

编辑:这是迄今为止我最受欢迎的答案,并且已经过去了几年,所以我添加了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


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

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

  2. 使用-subj标记,您可以指定主题(上面的示例)。


3
通过“ -subj”读取内容非常有效,但是-对我来说-仅在未设置OPENSSL_CONF的情况下。IOW:如果设置了OPENSSL_CONF,OpenSSL将尝试从那里读取,并忽略 “ -subj”命令行参数。花了我一段时间找出答案。
oberstet 2012年

oberstet:是的,是的。
bahamat 2012年

是否可以从stdin 传递主题密钥本身?我已经尝试过“ -key stdin”,“-key fd:1”和“ -key-”..。
oberstet 2012年

1
@JeremyBaker:不,您需要两步过程。省略-x509-days来生成CSR而不是证书,然后使用通常的CA签名方法。
bahamat

1
@jww-那个时候到了。从Chrome v58开始,当尝试加载安全页面但证书中不包含匹配的subjectAltName时,它将显示一个隐私错误页面,并显示错误消息“ NET :: ERR_CERT_COMMON_NAME_INVALID”。单击高级按钮将显示消息“ ...其安全证书来自[missing_subjectAltName]”
Insomniac Software

11

-passin选择做把戏吗?

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


在手册页中看到了该选项。看起来我无需提示就可以使用这种密码。谢谢!

和一起-passin 'pass:YOUR_PASSWORD'?- DOC:openssl.org/docs/man1.0.2/apps/...
andras.tim

5

接受的答案需要进行一些小的更正。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
    

这与接受的答案有何不同?
Ramhound

1
唯一重要的区别是,我明确列出了生成pem文件的步骤。可接受的答案缺少两个\字符,这使我认为该命令不正确。
安德烈·苏拉

1
您可能想提一提这个事实。如果接受的答案确实不完整且缺少字符,则重要的是要突出显示差异以及答案如何包含重要的重要信息。
Ramhound

3

尝试以下命令:

openssl genrsa -des3 -out user.key -passout pass:foo 1024

跳过的部分是:-passout pass:foo


2

@bahamat有一个很好的答案。不幸的是,某些版本的openssl在尝试使用一个命令创建ECDSA证书时引发错误。该错误类似于:

routines:EVP_PKEY_CTX_ctrl:invalid operation:pmeth_lib.c:404

我使用openssl 1.0.1e-fipsCentOS 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

最后一行不应该以结尾server.crt吗?
ᴠɪɴᴄᴇɴᴛ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.