題 避免密碼提示輸入密鑰並提示輸入DN信息


我使用以下代碼生成密鑰:

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的頂級選項)


85
2017-12-27 17:39


起源




答案:


編輯: 這是迄今為止我最受歡迎的答案,現在已經過了幾年,所以我添加了一個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 旗。看到 PASS PHRASE ARGUMENTS 在裡面 openssl(1) 有關如何格式化arg的手冊頁。

  2. 使用 -subj flag你可以指定主題(例子在上面)。


139
2017-12-27 19:44



通過“-subj”讀取內容非常有用,但是 - 對我來說 - 只有在未設置OPENSSL_CONF時才會這樣做。 IOW:如果設置了OPENSSL_CONF,OpenSSL將嘗試從那裡讀取,並且 忽視 “-subj”命令行參數。我花了一段時間才弄明白。 - oberstet
oberstet:是的,這是事實。 - bahamat
是否有可能通過該主題 鍵 本身來自stdin?我試過“-key stdin”,“ - key fd:1”和“-key - ”..沒有運氣。 - oberstet
@JeremyBaker:不,你需要一個兩步的過程。省略了 -x509 和 -days 要生成CSR而不是證書,請使用常用的CA簽名方法。 - bahamat
@jww - 那個時候到了。從Chrome v58開始,當嘗試加載安全頁面但證書不包含匹配的subjectAltName時,它會顯示隱私錯誤頁面,其中包含錯誤消息“NET :: ERR_CERT_COMMON_NAME_INVALID”。單擊高級按鈕會顯示消息“...其安全證書來自[missing_subjectAltName]” - Insomniac Software


-passin 選項為你做的伎倆?

file:pathname 表單,您可以非常安全地使用該文件的權限600。


8
2017-12-27 19:54



看到手冊頁中的選項。看起來我可以在沒有提示的情況下使用密碼。謝謝!
與 -passin 'pass:YOUR_PASSWORD'? - doc: openssl.org/docs/man1.0.2/apps/... - andras.tim


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

3
2018-06-08 19:28



這與接受的答案有何不同? - Ramhound
唯一重要的區別是我明確列出了生成pem文件的步驟。接受的答案是缺少兩個\字符,這讓我覺得命令不正確。 - Andrei Sura
你可能想提一下這個事實。如果接受的答案確實不完整,並且缺少字符,則重要的是突出顯示差異以及答案如何包含重要的重要信息。 - Ramhound


@bahamat有一個很好的答案。不幸的是,在嘗試使用一個命令創建ECDSA證書時,某些版本的openssl會拋出錯誤。錯誤類似於:

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

1
2018-02-20 08:06



不應該最後一行結束 server.crt? - ᴠɪɴᴄᴇɴᴛ


請嘗試以下命令:

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

跳過部分是: -passout pass:foo


0
2018-01-16 17:16