独自の証明書チェーンを作成する方法は?


62

独自のOCSPレスポンダーをセットアップしたい(テスト目的のみ)。これには、ルート証明書とそれから生成されたいくつかの証明書が必要です。

私はopensslを使用して自己署名証明書を作成することができました。ルート証明書として使用したい。次のステップは、派生証明書を作成することです。しかし、これを行う方法に関するドキュメントを見つけることができないようです。誰が私がこの情報を見つけることができるか知っていますか?

編集
振り返ってみると、私の質問はまだ完全には答えられていません。問題を明確にするために、次のように証明書チェーンを表します。

ルート-> A-> B-> C-> ...

現在、ROOTおよびA証明書を作成できますが、より長いチェーンを作成する方法がわかりません。

ルート証明書を作成するための私のコマンドは次のとおりです。

openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem

証明書Aは次のように作成されます。

openssl genrsa -out client.key 1024
openssl req -new -key client.key -out client.csr
openssl ca -in client.csr -out client.cer

このコマンドは、暗黙的にルート証明書に依存します。ルート証明書の場合、openssl構成ファイルで必要な情報が見つかります。

ただし、証明書Bは構成ファイルに登録されていないAのみに依存する必要があるため、前のコマンドはここでは機能しません。

証明書B以降を作成するには、どのコマンドラインを使用する必要がありますか?

編集この記事で
答えを見つけました。証明書B(チェーンA-> B)は、次の2つのコマンドで作成できます。

# Create a certificate request
openssl req -new -keyout B.key -out B.request -days 365

# Create and sign the certificate
openssl ca -policy policy_anything -keyfile A.key -cert A.pem -out B.pem -infiles B.request

openssl.cnfファイルも変更しました。

[ usr_cert ]
basicConstraints=CA:TRUE # prev value was FALSE

このアプローチはうまく機能しているようです。


編集セクションの下部にあるリンクが壊れています
熱狂的

2
2015年まで、この投稿の最後の編集で言及した記事は死んでいます。だから、経由ページを確認することができますWebアーカイブweb.archive.org/web/20100504162138/http://www.ibm.com/...
Iomanip

回答:


28

OpenSSLを直接使用できます。

  1. 認証局の秘密鍵を作成します(これが最も重要な鍵です):

    openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
    
  2. CAの自己署名証明書を作成します。

    openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem
    
  3. 最初にキーを生成してクライアント証明書を発行し、次に要求(または外部システムが提供するものを使用)してから、CAの秘密キーを使用して証明書に署名します。

    openssl genrsa -out client.key 1024
    openssl req -new -key client.key -out client.csr
    openssl ca -in client.csr -out client.cer
    

(これらのコマンドをopenssl.confファイルと一緒に使用しているため、いくつかのオプションを追加する必要がある場合があります。最初に独自の.confファイルをセットアップする必要がある場合があります。)


おかげで、私のopenssl.confファイルを少し調整した後、あなたの指示はうまくいきました。
StackedCrooked

3
@twk:質問には完全な回答に必要なもう1つのステップがあります。ルート証明書ではなく、ステップ3で作成した証明書のみに依存する別の証明書を作成する方法です。
いんちきのキホーテ

3
「CA秘密鍵をロードできません」という最後のステップで失敗します。キーと証明書にを提供することで途中まで到達できますopenssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.keyが、demoCAディレクトリとさまざまな付属品が必要です。
-Iiridayn

23
「いくつかのオプションを追加する必要があるかもしれません...」は、この回答からユーティリティを削除します。
ザック

14

CAを作成したら、それを使用して署名することができます。

  • キーを作成します。

    openssl genrsa -out key_A.key  1024
    
  • csrを作成します。

    openssl req -new -key key_A.key -out csr_A.csr
    You are about to be asked to enter information etc....
    
  • 署名する:

    openssl x509 -req -days 365 -in csr_A.csr -CA CA_certificate_you_created.crt \
    -CAkey CA_key_you_created.key -set_serial 01 -out crt_A.crt
    

    そのため* _Bとし、* _Aを交換する上CA_certificate_you_created.crtcrt_A.crtCA_key_you_created.keykey_A.key

あなたの変化:

basicConstraints=CA:TRUE  # prev value was FALSE

発行する証明書を使用して他の証明書に署名できることを意味します。


thx、非常に役立つ
フロット

1
どの.crtファイルですか?
MickyD

9

OpenSSLには、自己署名ルートCA証明書の作成に役立つPerlスクリプト「CA.pl」が付属します。また、一致する秘密キーに加えて、署名する将来の証明書(別名問題)そのルートCAを使用します。また、他のキーペアと証明書署名要求(CSR)を生成し、それらのCSRを処理する(つまり、証明書を発行する)などにも役立ちます。

多くの製品では、CA証明書としてCA証明書としてマークする特定の属性を含める必要があります。そうしないと、他の証明書の有効な署名者/発行者として受け入れられません。作成した自己署名証明書にその属性が含まれていない場合、他のソフトウェアを取得して有効なルートCA証明書のように扱うことができない場合があります。

正しく思い出せば、構文は次のようになります。

CA.pl -newca    # Create a new root CA  

CA.pl -newreq   # Create a new CSR

CA.pl -sign     # Sign a CSR, creating a cert  

CA.pl -pkcs12   # Turn an issued cert, plus its matching private key and trust chain, into a .p12 file you can install on another machine    

4
これは役に立ちました。Ubuntuの14.04で私はでファイルを見つけた/usr/lib/ssl/misc/CA.pl
コリン・M

-1

私はこの投稿を見つけました:https : //stackoverflow.com/questions/19665863/how-do-i-use-a-self-signed-certificate-for-a-https-node-js-server

Node.JS用ですが、このGitHubリポジトリのスクリプトはopenSLLコマンドを使用してルートCA証明書とドメイン証明書を作成します。

次を使用して実行: bash make-root-ca-and-certificates.sh 'example.com'

または、ローカルホストの場合: bash make-root-ca-and-certificates.sh 'localhost'

make-root-ca-and-certificates.sh

#!/bin/bash
FQDN=$1

# make directories to work from
mkdir -p certs/{server,client,ca,tmp}

# Create your very own Root Certificate Authority
openssl genrsa \
  -out certs/ca/my-root-ca.key.pem \
  2048

# Self-sign your Root Certificate Authority
# Since this is private, the details can be as bogus as you like
openssl req \
  -x509 \
  -new \
  -nodes \
  -key certs/ca/my-root-ca.key.pem \
  -days 1024 \
  -out certs/ca/my-root-ca.crt.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Signing Authority Inc/CN=example.com"

# Create a Device Certificate for each domain,
# such as example.com, *.example.com, awesome.example.com
# NOTE: You MUST match CN to the domain name or ip address you want to use
openssl genrsa \
  -out certs/server/privkey.pem \
  2048

# Create a request from your Device, which your Root CA will sign
openssl req -new \
  -key certs/server/privkey.pem \
  -out certs/tmp/csr.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Tech Inc/CN=${FQDN}"

# Sign the request from Device with your Root CA
# -CAserial certs/ca/my-root-ca.srl
openssl x509 \
  -req -in certs/tmp/csr.pem \
  -CA certs/ca/my-root-ca.crt.pem \
  -CAkey certs/ca/my-root-ca.key.pem \
  -CAcreateserial \
  -out certs/server/cert.pem \
  -days 500

# Create a public key, for funzies
# see https://gist.github.com/coolaj86/f6f36efce2821dfb046d
openssl rsa \
  -in certs/server/privkey.pem \
  -pubout -out certs/client/pubkey.pem

# Put things in their proper place
rsync -a certs/ca/my-root-ca.crt.pem certs/server/chain.pem
rsync -a certs/ca/my-root-ca.crt.pem certs/client/chain.pem
cat certs/server/cert.pem certs/server/chain.pem > certs/server/fullchain.pem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.