SSL証明書を介したnginxのクライアントの承認

はじめに:



ここでは、通常のリクエストに加えて、「高度な秘密」でリクエストを受け入れる必要がある小さなAPIを書くのに何とかかかりました。

これに遭遇したのは私が初めてではなく、世界はそのようなことのために長い間SSLを使用してきました。



サーバーでnginxが使用されているため、 SSLモジュールがインストールされました

Googleは実行可能なハウツーを1つも提供しませんでしたが、ネットワーク上の情報は一部です。



したがって、 SSL証明書を介してクライアントを承認するためのnginxの設定に関するステップバイステップガイド



注意! この記事では、例として自己署名証明書を使用します!



開始する前に、nginx configにフォルダーを作成します。ここでの作業の成果は次のとおりです。



cd /path/to/nginx/config/ mkdir ssl && cd ssl
      
      







手順1.自己署名の信頼できる証明書を作成します。





クライアント証明書に署名し、Webサーバーでクライアントを承認するときにそれらを検証するには、個人の信頼できる証明書(認証局またはCA)が必要です。

以下のコマンドを使用すると、秘密鍵と自己署名証明書が作成されます。



 openssl req -new -newkey rsa:1024 -nodes -keyout ca.key -x509 -days 500 -subj /C=RU/ST=Moscow/L=Moscow/O=Companyname/OU=User/CN=etc/emailAddress=support@site.com -out ca.crt
      
      







引数の説明:



req新しい証明書の作成要求。

-new証明書署名要求(CSR)を作成します。

-newkey rsa:1023新しい1024ビットRSA秘密鍵が自動的に作成されます。 必要に応じてキーの長さを構成できます。

-nodes秘密鍵を暗号化しません。

-keyout ca.key ca.keyファイルに秘密鍵を保存します。

-x509 CSRを作成する代わりに(-newオプションを参照)、自己署名証明書を作成します。

-days 500証明書の有効期限は500日です。 有効期間のサイズは必要に応じて調整できます。 この証明書を使用してクライアント証明書に署名するため、小さな値を入力することはお勧めしません。

-subj /C=RU/ST=Moscow/L=Moscow/O=Companyname/OU=User/CN=etc/emailAddress=support@site.com

証明書データ、パラメーター=値のペアは、「/」でリストされます。 パラメータ値の文字は、バックスラッシュ「\」を使用して「切り捨て」ることができます(例:「O = My \ Inc」)。 引数を引用することもできます。たとえば、-subj“ / xx / xx / xx”。



ステップ2.サーバー証明書



nginxの証明書を作成して要求する

 openssl genrsa -des3 -out server.key 1024 openssl req -new -key server.key -out server.csr
      
      







私たちは自分の署名で証明書に署名します

 openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
      
      







nginxが再起動時にパスワードを要求しないように、パスワードのない証明書のコピーを作成します

 openssl rsa -in server.key -out server.nopass.key
      
      







Nginxの構成


 listen *:443; ssl on; ssl_certificate /path/to/nginx/ssl/server.crt; ssl_certificate_key /path/to/nginx/ssl/server.nopass.key; ssl_client_certificate /path/to/nginx/ssl/ca.crt; ssl_verify_client on; keepalive_timeout 70; fastcgi_param SSL_VERIFIED $ssl_client_verify; fastcgi_param SSL_CLIENT_SERIAL $ssl_client_serial; fastcgi_param SSL_CLIENT_CERT $ssl_client_cert; fastcgi_param SSL_DN $ssl_client_s_dn;
      
      







これで、サーバーはhttps要求を受け入れる準備ができました。

証明書情報を持つ変数は、主にSSL_VERIFIED(値SUCCESSを取得)のバックエンドの変数に現れました。



ただし、サイトにアクセスしようとすると、エラーがスローされます。

 400 Bad Request No required SSL certificate was sent
      
      







まあ、論理的に、それはすべての塩です!



ステップ3.クライアント証明書を作成する





3.1 CAの準備




構成を作成する

nano ca.config



次の内容で:

 [ ca ] default_ca = CA_CLIENT #    #   CA_CLIENT [ CA_CLIENT ] dir = ./db #     certs = $dir/certs #    new_certs_dir = $dir/newcerts #     database = $dir/index.txt #       serial = $dir/serial #      (  ) certificate = ./ca.crt #   CA private_key = ./ca.key #    CA default_days = 365 #     default_crl_days = 7 #   CRL default_md = md5 #   policy = policy_anything #          [ policy_anything ] countryName = optional #  optional -  , supplied -  stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = optional emailAddress = optional
      
      







次に、構成ファイルに記述されているものに対応するディレクトリとファイル構造を準備する必要があります



 mkdir db mkdir db/certs mkdir db/newcerts touch db/index.txt echo "01" > db/serial
      
      







3.2。 クライアント秘密鍵と証明書要求(CSR)の作成




署名済みのクライアント証明書を作成するには、最初に後続の署名用の証明書要求を作成する必要があります。 コマンド引数は、自己署名の信頼できる証明書の作成に使用される引数と完全に似ていますが、-x509パラメーターがありません。



 openssl req -new -newkey rsa:1024 -nodes -keyout client01.key -subj /C=RU/ST=Moscow/L=Moscow/O=Companyname/OU=User/CN=etc/emailAddress=support@site.com -out client01.csr
      
      







コマンドの結果として、client01.keyとclient01.csrの2つのファイルが表示されます。



3.3。 信頼できる証明書(CA)を使用した証明書要求署名(CSR)。




要求に署名するときに、ca.configファイルで指定されたパラメーターが使用されます



 openssl ca -config ca.config -in client01.csr -out client01.crt -batch
      
      







コマンドの結果として、クライアント証明書ファイルclient01.crtが表示されます。



次の証明書を作成するには、これらの2つの手順を繰り返します。



3.4。 クライアントブラウザー用のPKCS#12証明書の作成


これは、私の場合のように、ソウルレスなマシンがサーバーに接続されていない場合でも、ブラウザを介して生きている人がいる場合です。

パスワードで保護されたPKCS#12ファイルは、サイトにアクセスできるようにブラウザーにフィードする必要があります。



 openssl pkcs12 -export -in client01.crt -inkey client01.key -certfile ca.crt -out client01.p12 -passout pass:q1w2e3
      
      







3.5 curlを使用して受信したsslサーバーへの接続


 curl -k --key client.key --cert client1.crt --url "https://site.com"
      
      







例の証明書は自己署名されているため、-kオプションが使用されます



使用ソフトウェア



Ubuntu Server 10.10(Linux 2.6.35-22-server#35-Ubuntu SMP x86_64 GNU / Linux)

nginx 0.9.3

OpenSSL 0.9.8o 2010年6月1日



便利なリンク







それが誰かに役立つことを願っています。



PSこの投稿は2011年1月16日に私の最初の出版物で、古いコピーは削除されました(サイト管理者の要求により、アカウントに関連付けられていなかったため)。



All Articles