階段の下でホストされている小さなApacheサーバー用の自己署名クライアント証明書を生成します。以下のスクリプトは、この目的のために一緒にハッキングされました。 'mini-CA' x509 method を使用しているため、index.txtには何も記録されていません。
次に、そのようなクライアント証明書を1つ取り消す必要があります。これには、CRLを生成してApacheに追加する必要があります。ただし、CRLの生成にはindex.txtが必要なようです。
root@myserver:~# openssl ca -cert "ssl_ca/ca.crt" -keyfile "ssl_ca/ca.key" -revoke "ssl_badguy/badguy.p12"
./demoCA/index.txt: No such file or directory
unable to open './demoCA/index.txt'
証明書の作成ごとに、「スタンドアロン」のCRL生成コマンドはありますか? CAの永続性や適切なSSLの「理論」を尊重することは気にしません(そうしないと、最初に自己署名がありません)。もともとは、サーバーへのアクセスをセキュリティで保護して制御したかっただけです。今、私はそのアクセスの一部を取り消すだけです。
次のスクリプトは、./ clientcert.sh certnameとして呼び出されると、すべてのbumf(PKCS12を含む)を使用して新しいディレクトリ/ root/ssl_certname /を作成します。
#! /bin/bash
echo 'When it asks for a key password (3 times), recommend you use the new key name'
echo 'When it asks for cert details, use "." (blank) for all, EXCEPT CN, which should'
echo 'also be the key name. All other passwords ("Export" etc.) are blank'
clientname="$1"
newdir="/root/ssl_$1"
caloc="/root/ssl_ca"
cert="$newdir/$1"
if [ -d "$newdir" ]; then
echo "$newdir already exists!"
else
mkdir "$newdir"
cd "$caloc"
openssl genrsa -des3 -out "$cert.key" 2048
openssl rsa -in "$cert.key" -out "$cert.key.insecure"
mv "$cert.key" "$cert.key.secure"
mv "$cert.key.insecure" "$cert.key"
openssl req -new -key "$cert.key" -out "$cert.csr"
openssl x509 -req -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -in "$cert.csr" -out "$cert.crt"
openssl pkcs12 -export -clcerts -in "$cert.crt" -inkey "$cert.key" -out "$cert.p12"
fi
編集:技術的には問題を解決しませんが、default-sslvhostに以下を追加することで同じことを達成しました:
# Block badguy client cert
Rewritecond %{SSL:SSL_CLIENT_S_DN_CN} =badguy
RewriteRule (.*) /blocked [QSA,R,L]
-/ blockedが実際に存在しない場所(保留ページをそこに配置できると思います)。
まず、はっきりさせておきましょう。クライアント証明書は自己署名されていません。それらはCAによって署名されており、そのCAの証明書は自己署名されています。これは重要です。自己署名証明書は完全に取り消すことができないためです。定義上、取り消しは発行元のCAからの情報です。自己署名証明書は独自のCAです。
2番目の重要な点は、CRLが失効した証明書のリストであることです。したがって、1つの証明書を取り消すと、その証明書を指定するCRLが作成されます。次に別の証明書を取り消す場合、次のCRLは両方の証明書を指定する必要があります。次のCRLが2番目の証明書についてのみ話している場合、最初の証明書は「取り消されません」。失効の場合、Apacheにはメモリがありません。CRLはApacheのメモリです。 Apacheは最新のCRLをすべての証明書の失効情報の唯一のソースとして使用します。
つまり、CAで失効した証明書のリストを維持する必要があります。 openssl
コマンドラインツールは、このようなリストを維持できます。これは、index.txt
コマンドラインオプションによって維持されるopenssl ca
ファイルです。使用しない場合は、自分で情報を管理する必要があります。これは、せいぜい面倒です。取り消しをまったく処理したい場合、最も簡単な方法は、index.txt
を使用してOpenSSLに管理させることです。
これで、すでにそれを行っている場合は、プログラムでlibraryを使用してCA秘密鍵でCRLに署名することはもちろん可能です。しかし、そのためのコマンドラインツールはありません。これは ドキュメント でそう言われています:
[〜#〜]バグ[〜#〜]
理想的には、適切なオプションとファイルを使用してCRLを作成することも可能であるべきです。
また あり :
[〜#〜]制限[〜#〜]
テキストデータベースインデックスファイルはプロセスの重要な部分であり、破損している場合は修正が困難な場合があります。理論的には、発行されたすべての証明書と現在のCRLからインデックスファイルを再構築することができます。ただし、これを行うオプションはありません。
いくつかのコードでCRLを作成するには、OpenSSLソースコードのapps/ca.c
ファイルを確認することをお勧めします。 「X509_CRL_new
」を検索してください。機能は十分に文書化されていません...しかし、私が主張するのは、証明書を取り消す場合は、それまでに取り消されたすべての証明書のリストを維持する必要があります(少なくともシリアル番号、できればそれぞれの取り消し日を含む)。これは基本的に、index.txt
のopenssl ca
ファイルを独自に作成することを意味します。
今、私は別のレベルで別の答えを追加する必要があることに気づきました。
authorizationに証明書を使用しようとしています。しないでください。長期的にはうまく機能しません。
証明書はauthentication用です。証明書はあなたに教えます:this男はthat公開鍵を所有しています。失効はそれをキャンセルする方法であり、キーの所有権が維持されなくなったときに使用することを意図しています。秘密鍵が盗まれたため、その男はもはや公開鍵を「所有」していません。あなたのケースでは、キーの所有権はまだ有効です:男は歓迎されないと宣言されていますが、彼はまだ自分の証明書から公開キーを所有しています。その意味で、失効は適切なツールではありません。
技術的には、証明書の配布にはコストがかかり、証明書の失効は非同期であるという事実に端を発しています。物事を行う「正しい」方法は、証明書をauthentication(クライアントが自分の身元を証明する)に使用することですが、authorizationを他の場所で処理することです。承認は、ユーザーが決定するプロセスです特定のIDに対して許可されるアクション。承認ビットを証明書にプッシュしようとすることは、悲しみにつながる道です(PKIに関わるすべての人がある時点で犯す典型的な間違いですが、それでも間違いです)。
mod_authz_user モジュールは、認証情報(許可または拒否されたユーザーのリストなど)を便利なファイル(私は試していません)に維持するのに役立ちます。
index.txt
ファイルは、生成された証明書と、失効日などのいくつかのプロパティを追跡するために使用されます。このファイルは、CRLの生成に使用されます。
-gencrl
this option generates a CRL based on information in the index file.
必要に応じてopenssl.conf
ファイルのデフォルトファイルを変更するか、次のように独自のファイルを使用できます: https://stackoverflow.com/a/7770075 、または次の回答が示唆するように、x509コマンドを使用して手動でジョブを実行してみてください: https://stackoverflow.com/a/13047670 。
後者は、-CAoptionsを使用して、openss.conf
のデフォルトオプションを回避します。 index.txt
ファイルはopenssl CA設定の重要な部分であり、本番環境では無視しないでください。