Hadoop運用 >

目次

認証局の構築

構築手順

  1. 認証局管理のためのディレクトリを用意し、設定ファイル(openssl.cnf)とCAユーティリティスクリプト(debian.pngCA.sh、centos.pngCA)をコピーします。※CA.shスクリプトの入出力ファイルは固定ですので、最初のCA構築時にのみ使用します。
    $ sudo mkdir -p /grid/etc/CA
    $ cd /grid/etc/CA
    1. debian.pngDebian
      $ sudo cp /usr/lib/ssl/misc/CA.sh ./
      $ sudo cp /usr/lib/ssl/openssl.cnf ./
    2. centos.pngCentOS
      $ sudo cp /etc/pki/tls/misc/CA ./
      $ sudo cp /etc/pki/tls/openssl.cnf ./
  2. バック・アップの上、環境設定を編集します。
    $ sudo cp CA.sh CA.sh.org
    $ sudo cp openssl.cnf openssl.cnf.org
    1. openssl.cnf: 格納ディレクトリを修正の上、現時点でのセキュリティ事情に応じて暗号強度を高めます。
      1. $ diff -u openssl.cnf.org openssl.cnf
      2. --- openssl.cnf.org     2012-06-23 15:38:31.000000000 +0900
      3. +++ openssl.cnf 2012-06-23 15:47:18.000000000 +0900
      4. @@ -34,7 +34,7 @@
      5.  ####################################################################
      6.  [ CA_default ]
      7.  
      8. -dir            = ./demoCA              # Where everything is kept
      9. +dir            = ./ca                  # Where everything is kept
      10.  certs          = $dir/certs            # Where the issued certs are kept
      11.  crl_dir                = $dir/crl              # Where the issued crl are kept
      12.  database       = $dir/index.txt        # database index file.
      13. @@ -67,7 +67,7 @@
      14.  
      15.  default_days   = 365                   # how long to certify for
      16.  default_crl_days= 30                   # how long before next CRL
      17. -default_md     = sha1                  # which md to use.
      18. +default_md     = sha512                # which md to use.
      19.  preserve       = no                    # keep passed DN ordering
      20.  
      21.  # A few difference way of specifying how similar the request should look
      22. @@ -98,7 +98,7 @@
      23.  
      24.  ####################################################################
      25.  [ req ]
      26. -default_bits           = 1024
      27. +default_bits           = 4096
      28.  default_keyfile        = privkey.pem
      29.  distinguished_name     = req_distinguished_name
      30.  attributes             = req_attributes
    2. CA.sh: 設定ファイルを読み込む設定を追加し、検証目的のためここでは証明書の有効期限を長め(CA10年、サーバ5年)に変更しています。
      1. $ diff -u CA.sh.org CA.sh
      2. --- CA.sh.org   2012-06-23 15:45:35.000000000 +0900
      3. +++ CA.sh       2012-06-23 15:53:04.000000000 +0900
      4. @@ -27,6 +27,10 @@
      5.  # tjh@cryptsoft.com
      6.  #
      7.  
      8. +CATOP=./ca
      9. +SSLEAY_CONFIG='-config ./openssl.cnf'
      10. +DAYS='-days 1825'
      11. +
      12.  # default openssl.cnf file has setup as per the following
      13.  # demoCA ... where everything is stored
      14.  cp_pem() {
      15. @@ -61,7 +65,7 @@
      16.  if [ -z "$OPENSSL" ]; then OPENSSL=openssl; fi
      17.  
      18.  if [ -z "$DAYS" ] ; then DAYS="-days 365" ; fi # 1 year
      19. -CADAYS="-days 1095"    # 3 years
      20. +CADAYS="-days 3650"    # 10 years
      21.  REQ="$OPENSSL req $SSLEAY_CONFIG"
      22.  CA="$OPENSSL ca $SSLEAY_CONFIG"
      23.  VERIFY="$OPENSSL verify"
  3. 認証局を作成します。入力内容は例ですので、適宜変更してください。
    $ sudo ./CA.sh -newca
    CA certificate filename (or enter to create)
    
    Making CA certificate ...
    Generating a 4096 bit RSA private key
    .........................+++
    ...............+++
    writing new private key to './ca/private/./cakey.pem'
    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:JP
    State or Province Name (full name) [Some-State]:Tokyo
    Locality Name (eg, city) []:Chiyoda-ku
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Grid
    Organizational Unit Name (eg, section) []:
    Common Name (eg, YOUR name) []:Grid Internal CA
    Email Address []:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    Using configuration from ./openssl.cnf
    Enter pass phrase for ./ca/private/./cakey.pem:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
            Serial Number:
                88:94:91:74:2d:29:60:3b
            Validity
                Not Before: Jun 23 07:02:34 2012 GMT
                Not After : Jun 21 07:02:34 2022 GMT
            Subject:
                countryName               = JP
                stateOrProvinceName       = Tokyo
                organizationName          = Grid
                commonName                = Grid Internal CA
            X509v3 extensions:
                X509v3 Subject Key Identifier:
                    AB:94:68:16:7F:8A:64:80:04:62:CA:6E:4D:A5:44:A1:D3:FF:25:3D
                X509v3 Authority Key Identifier:
                    keyid:AB:94:68:16:7F:8A:64:80:04:62:CA:6E:4D:A5:44:A1:D3:FF:25:3D
                    DirName:/C=JP/ST=Tokyo/O=Grid/CN=Grid Internal CA
                    serial:88:94:91:74:2D:29:60:3B
    
                X509v3 Basic Constraints:
                    CA:TRUE
    Certificate is to be certified until Jun 21 07:02:34 2022 GMT (3650 days)
    
    Write out database with 1 new entries
    Data Base Updated
  4. CAの秘密鍵のパーミッションを確認しておきます。
    $ sudo chmod 400 ca/private/cakey.pem
  5. CAの証明書(cacert.pem)をセキュアな経路でフィンガープリントを明示しつつ、配布します。

CA証明書の配布

  • CA証明書は機密情報ではありませんが、改竄の危険性には十分注意する必要があります。アクセス制御された経路で配備し、そのパーミッション(特に変更権限)を適切に設定しなければなりません。

Chefレシピ

参考までに、これはCA証明書を配備するChefレシピです。証明書ファイルはSCMにはコミットせず、適切なACLでChef Serverにのみアップロードするとよいでしょう。

証明書署名要求(CSR, certificate signing request)の作成

  • 本来的には認証局の業務ではありませんが、ある程度限定された環境でPKIが構築される場合には要求と署名の運営主体が同じになるケースがありますので、ここで説明します。CSR生成は CA.sh -newreq でも可能ですが新規に秘密鍵を生成してしまいますし、利用者側にこのようなCA環境があるとは限りませんので、直接opensslコマンドを使用する例を示します。
  1. openssl.cnf: subjectAltName? 追加(note.pngChrome 58以降で必須)に対応するために、req セクションの req_extensions を有効にし v3_req セクションに subjectAltName?=${ENV::SAN} を追加します。subjectAltName?を追加する方法はいくつかありますが、この例は環境変数 SAN を経由して設定する方法です。設定の手間が少ない上に、環境変数を設定していない場合には設定ファイルのパースに失敗しますので事前にミスを防げるでしょう。
    1. # ...
    2.  
    3. [ req ]
    4.  
    5. req_extensions = v3_req # The extensions to add to a certificate request
    6.  
    7. # ...
    8.  
    9. [ v3_req ]
    10.  
    11. # Extensions to add to a certificate request
    12.  
    13. basicConstraints = CA:FALSE
    14. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    15. subjectAltName=${ENV::SAN}
    16.  
    17. # ...
  2. 環境変数 SAN を設定します。
    $ export SAN=DNS:ns00.grid.example.com
    $ export SAN=DNS:example.com,DNS:www.example.com         # 複数の場合
    $ export SAN='DNS:*.example.com,DNS:*.grid.example.com'  # マルチドメイン対応ワイルドカード証明書の場合
  3. 初回の場合にはまずサーバの秘密鍵を生成し、そのパーミッションを適切に設定します。
    $ sudo mkdir -p servers/ns00
    $ sudo openssl genrsa -out servers/ns00/serverkey.pem -aes256 4096
    Generating RSA private key, 4096 bit long modulus
    .......+++
    ................................................................+++
    e is 65537 (0x10001)
    Enter pass phrase for servers/ns00/serverkey.pem:
    Verifying - Enter pass phrase for servers/ns00/serverkey.pem:
    
    $ sudo chmod 400 servers/ns00/serverkey.pem
  4. 秘密鍵を用いて証明書署名要求(CSR)を作成します。sudo コマンドに -E オプションを付加するのは、先程設定した環境変数を引き継ぐためです。
    $ sudo -E openssl req -config openssl.cnf -new -key servers/ns00/serverkey.pem -out servers/ns00/servercsr.pem
    Enter pass phrase for servers/ns00/serverkey.pem:
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:JP
    State or Province Name (full name) [Some-State]:Tokyo
    Locality Name (eg, city) []:Chiyoda-ku
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Grid
    Organizational Unit Name (eg, section) []:
    Common Name (eg, YOUR name) []:ns00.grid.example.com  # ワイルドカード証明書の場合には *.grid.example.com などとします。
    Email Address []:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
  5. 証明書署名要求の内容は以下のコマンドで確認できます。
    $ openssl req -text -noout -in servers/ns00/servercsr.pem
  6. 認証局に送付し、署名を依頼します。note.pngなお、opensslを使った場合、証明書署名要求にsubjectAltName?が設定されているからといってCAの署名する証明書にsubjectAltName?が必ず設定されるわけではありません。

証明書署名要求への署名

  1. openssl.cnf: subjectAltName? 追加(note.pngChrome 58以降で必須)に対応するために、usr_cert セクションに subjectAltName?=${ENV::SAN} を追加します。subjectAltName?を追加する方法はいくつかありますが、この例は環境変数 SAN を経由して設定する方法です。設定の手間が少ない上に、環境変数を設定していない場合には設定ファイルのパースに失敗しますので事前にミスを防げるでしょう。
    1. # ...
    2.  
    3. [ usr_cert ]
    4.  
    5. subjectAltName=${ENV::SAN}
    6.  
    7. # ...
  2. 環境変数 SAN を設定します。
    $ export SAN=DNS:ns00.grid.example.com
    $ export SAN=DNS:example.com,DNS:www.example.com         # 複数の場合
    $ export SAN='DNS:*.example.com,DNS:*.grid.example.com'  # マルチドメイン対応ワイルドカード証明書の場合
  3. リプレイスで古い証明書の期限が残っている場合には、古い証明書を失効させます。以降、sudo コマンドに -E オプションを付加するのは、先程設定した環境変数を引き継ぐためです。
    $ sudo -E openssl ca -config openssl.cnf -revoke servers/ns00/servercert.pem
    Using configuration from openssl.cnf
    Enter pass phrase for ./ca/private/cakey.pem:
    Revoking Certificate B92B00A924AF3350.
    Data Base Updated
    1. なお、CRLファイルは以下の要領で生成します。
      $ sudo -E openssl ca -config openssl.cnf -gencrl -out ca/revoke.crl 
  4. CAの秘密鍵と証明書を用いてサーバの証明書署名要求に署名します。通常の有効期限は365日ですが、ここでは検証用ですので明示的に1825日にしています。Subject Alternative Nameが追加されていることも確認します。
    $ sudo -E openssl ca -config openssl.cnf -days 1825 -in servers/ns00/servercsr.pem -out servers/ns00/servercert.pem
    Using configuration from openssl.cnf
    Enter pass phrase for ca/private/cakey.pem:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
            Serial Number:
                88:94:91:74:2d:29:60:3c
            Validity
                Not Before: Jun 23 09:37:38 2012 GMT
                Not After : Jun 22 09:37:38 2017 GMT
            Subject:
                countryName               = JP
                stateOrProvinceName       = Tokyo
                organizationName          = Grid
                commonName                = ns00.grid.example.com
            X509v3 extensions:
                X509v3 Basic Constraints:
                    CA:FALSE
                Netscape Comment:
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier:
                    C5:A1:05:97:3A:B4:53:FB:90:8A:6C:FF:94:54:0F:D5:47:A6:1D:BF
                X509v3 Authority Key Identifier:
                    keyid:AB:94:68:16:7F:8A:64:80:04:62:CA:6E:4D:A5:44:A1:D3:FF:25:3D
    
                X509v3 Subject Alternative Name:
                    DNS:ns00.grid.example.com
    Certificate is to be certified until Jun 22 09:37:38 2017 GMT (1825 days)
    Sign the certificate? [y/n]:y
    
    
    1 out of 1 certificate requests certified, commit? [y/n]y
    Write out database with 1 new entries
    Data Base Updated
  5. 生成された署名済証明書を利用者に返送します。

サーバ秘密鍵と証明書の配備

  1. サーバ秘密鍵と受け取った署名済証明書をサーバに配備します。必要に応じて以下の要領でパスフレーズなしの秘密鍵を作成します。
    $ sudo openssl rsa -in /etc/apache2/ssl.key/server.key -out /etc/apache2/ssl.key/server.key
    Enter pass phrase for /etc/apache2/ssl.key/server.key:
    writing RSA key
    $ sudo chmod 400 /etc/apache2/ssl.key/server.key

証明書失効リスト(CRL)の管理

Coming Soon.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-10-06 (土) 12:01:42 (17d)