web-dev-qa-db-ja.com

Apacheは私の自己署名証明書がCA証明書であることを警告します

Opensslコマンドの引数を暗記していないので、(テスト環境用に)自己署名証明書を作成する必要があるときはいつでも、同じ SO answer を参照することに慣れています。コマンドは次のようになります。

openssl req -x509 -nodes -newkey rsa:2048 -keyout mysite.key -out mysite.crt -days 365

そしてそれは通常、例えば私の現在のUbuntu 15.10で動作します。今日、私はDebian Jessieの新規インストールを行っていますが、そうではありません。 Apacheは起動時に次のことを警告します。

[ssl:warn] [pid 1040] AH01906: www.mysite.com:443:0 server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)

私はこの問題の解決策を探したところ、 Linuxフォーラムの回答 が見つかりました。代わりに、以下を使用する必要があります。

openssl genrsa -des3 -passout pass:x -out mysite.pass.key 2048
openssl rsa -passin pass:x -in mysite.pass.key -out mysite.key
openssl req -new -key mysite.key -out mysite.csr
openssl x509 -req -days 365 -in mysite.csr -signkey mysite.key -out mysite.crt

そして、それは本当です、このようにApacheの警告が消えます。

私が理解している限り、これはパスフレーズで保護されたキーを作成し、次にパスフレーズを削除し、CSRを作成して、CSRとキーの両方を含む証明書を生成します。

だから問題は、この長いバージョンは短いバージョンでは何ができないのか、そしてなぜそれが必要なのか(今日の私のように)?

15
marcv

短い方法(例:OpenSSL 1.1.0fおよびApache 2.4.37):

openssl genrsa -out notEncodedPk.key 3072
openssl req -new -out website.csr -sha256 -key notEncodedPk.key
openssl x509 -req -in website.csr -days 365 -signkey notEncodedPk.key -out website.cert -outform PEM

genrsa 3072ビットのRSAキーを生成します。 (システムは、シードのために/ dev /(u)randomに適切なデータを保持するために、しばらくの間オンラインである必要があります。)暗号化されたPK(1)を生成してからrsaを使用して削除する必要はありません。その後のパスワード。 (おそらく、以前のバージョンのツールではパスワードが必要でしたか?)
reqは証明書署名リクエストを作成し、署名にPKを使用します。ダイジェストに-sha256のようなものを提供することはオプションです。 (3)インタラクティブな質問に情報を提供します。サイトのドメインを「一般名:」に含めるようにしてください。そうしないと、Apacheが警告(AH01909)をスローし、URL /ドメインが証明書データと一致しないため、ブラウザーが「無効な証明書」メッセージをスローします(2)。 「チャレンジパスワード:」は空白のままにします。
x509を使用して-signkeyで自己署名証明書を作成します(サブジェクトは発行者にコピーされます)。通常、コマンドは証明書で機能しますが、-reqを使用すると、CSRを入力として受け入れます。次に、PKを使用して証明書に署名します。 (-outformおよび-daysはオプションであり、後者のデフォルト値は30日です。)

問題の原因:

User207421がすでに述べたように、req CSRを作成します[〜#〜] or [〜#〜]自己署名を作成しますroot-CA-like証明書、したがって一般的なチュートリアルのヒント

openssl req -x509 -nodes -days 365 -newkey rsa:3072 -sha256 -keyout website.key -out website.cert

短いですが、通常あなたが望むものではありません。また、作成された証明書を

openssl x509 -text -noout -in website.cert

単一行コマンドで作成された証明書には、「X509v3 Basic Constraints:critical CA:TRUE」のセクション「X509v3 extensions:」が表示されます。これはまさにApacheの警告メッセージです。
代わりに、3つのステップで証明書を作成した場合、「X509v3拡張:」セクションは証明書に含まれません。

付録:

(1)ほとんどの場合、パスワードでPKを保護することをお勧めします。 PKが暗号化なしで保存されている場合は、ルートへのアクセスを制限してください。パスワードを使用する場合は-passout/-passinオプションを使用する必要がありますが、一部のOpenSSLツールには少なくとも4文字が必要なため、単純な「x」は機能しなくなります(それ以外の場合: 「結果が小さすぎる/不正なパスワードの読み取り」)。さらに、ApacheでSSLPassPhraseDialog buildinのようなものを使用して、Apacheの起動時にPK(またはすべてのPK /証明書)に必要なパスワードを手動で入力する必要があります。

(2)とにかく、ブラウザは自己署名証明書の警告を表示します。

(3)SHA-1の使用は、そのような大きなRSAキーには不十分です。一般に、openssl.confを確認することをお勧めします。 Debian 9では/etc/ssl/openssl.confにあり、たとえばsigner_digest = sha256などのさまざまなデフォルトが含まれています。
Debian 9ファイルでは、[req]セクションにx509_extensions = v3_caという行もあり、これがreqコマンドが自己署名証明書を作成するために単一行スタイルで使用されている場合、-x509オプションと組み合わせて、CA関連の拡​​張(basicContraints = critical、CA:true)を追加します。

さらに、コメント行#req_extensions = v3_reqに気付くかもしれません。この行はコメント化されているため(Debian 9ではデフォルトのopenssl.cnf)、reqコマンドの単純な使用法には拡張機能が含まれていません。
変更したファイルでこの行を使用してSubject Alternative Nameを証明書に追加する場合があることに注意してください。そのため、複数の(サブ)ドメインを処理できます(通常、CNでワイルドカードを使用するよりもはるかに優れた選択肢です(例:* .example.com))。

6
GerryH

openssl reqは、CSRまたはCAルート証明書を作成します。 manページを参照してください。それはあなたが望むものではありません。ステップの2番目のセットは正しいです。

0
user207421

今日もDebian 9ストレッチで同じ問題があり、あなたの解決策をあなたの方法で新しい証明書を生成しようとしましたが、うまくいきませんでした。 Apacheの警告はまったく同じでした。

問題は、私のブラウザーに同じFQDNを持つ他の6つの証明書が保存されていることであることがわかりました。証明書を消去したところ、問題は解決しました。

編集:まあ、実際にはまだ警告がありますが、少なくともすべてが機能しています。

0