タグ: apache

自己署名証明書を生成してくれるdockerコンテナOMGWTFSSLを試す

ローカルでの開発などでLet’s Encryptを使用できないときに、従来の方法で自己署名証明書が必要な際、このOMGWTFSSLを使って証明書を生成すると、プライベート認証局の証明書とそれで署名したサーバ証明書を得ることができます。

プライベート認証局の証明書をブラウザに登録し、サーバ証明書をApache,NGIXなどに設定すると、例外設定せずにhttpsでアクセスすることができます。

paulczar/omgwtfssl: SSL certificate generation for developers who don’t TLS good

OpenSSLを使った従来の方法

OMGWTFSSLを使った方法

前提

  • OSはUbuntu 18.04
  • WEBサーバとしてApacheを使用
  • Dockerはインストール済み
  • foo.example.jpというドメイン名でアクセスできるように設定済み

証明書の生成とインストール

  1. OMGWTFSSLコンテナを実行
    $ docker run -e SSL_SUBJECT="foo.example.jp" -v /tmp/certs:/certs  paulczar/omgwtfssl
    ----------------------------
    | OMGWTFSSL Cert Generator |
    ----------------------------
    
    --> Certificate Authority
    ====> Generating new CA key ca-key.pem
    Generating RSA private key, 2048 bit long modulus
    ....................................................+++
    .+++
    e is 65537 (0x10001)
    ====> Generating new CA Certificate ca.pem
    ====> Generating new config file openssl.cnf
    ====> Generating new SSL KEY key.pem
    Generating RSA private key, 2048 bit long modulus
    ....................................................................................................................................................................................................................+++
    ....................................................+++
    e is 65537 (0x10001)
    ====> Generating new SSL CSR key.csr
    ====> Generating new SSL CERT cert.pem
    Signature ok
    subject=/CN=foo.example.jp
    Getting CA Private Key
    ====> Complete
    keys can be found in volume mapped to /certs
    
    ====> Output results as YAML
    ---
    ca_key: |
      -----BEGIN RSA PRIVATE KEY-----
      :
      :
      :
      -----END RSA PRIVATE KEY-----
    
    ca_crt: |
      -----BEGIN CERTIFICATE-----
      :
      :
      :
      -----END CERTIFICATE-----
    
    ssl_key: |
      -----BEGIN RSA PRIVATE KEY-----
      :
      :
      :
      -----END RSA PRIVATE KEY-----
    
    ssl_csr: |
      -----BEGIN CERTIFICATE REQUEST-----
      :
      :
      :
      -----END CERTIFICATE REQUEST-----
    
    ssl_crt: |
      -----BEGIN CERTIFICATE-----
      :
      :
      :
      -----END CERTIFICATE-----
    
  2. 生成されたファイルの確認
    $ ls -l /tmp/certs
    total 32
    -rw-r--r-- 1 root root 1679 Apr 15 07:51 ca-key.pem
    -rw-r--r-- 1 root root  973 Apr 15 07:51 ca.pem
    -rw-r--r-- 1 root root   17 Apr 15 07:51 ca.srl
    -rw-r--r-- 1 root root 1066 Apr 15 07:51 cert.pem
    -rw-r--r-- 1 root root  997 Apr 15 07:51 key.csr
    -rw-r--r-- 1 root root 1675 Apr 15 07:51 key.pem
    -rw-r--r-- 1 root root  241 Apr 15 07:51 openssl.cnf
    -rw-r--r-- 1 root root 3791 Apr 15 07:51 secret.yaml
    

    プライベート認証局の証明書と秘密鍵、サーバ証明書とその秘密鍵などが生成されている

  3. サーバ証明書を移動

    ApacheのデフォルトSSL設定の/etc/apache2/sites-available/default-ssl.confにある、SSLCertificateFileSSLCertificateKeyFileのパスがそれぞれ、/etc/ssl/certs//etc/ssl/private/にあるので、それにならってファイルを移動

    $ sudo mv /tmp/certs/cert.pem /etc/ssl/certs/
    $ sudo mv /tmp/certs/key.pem /etc/ssl/private/
    
  4. サイトの追加

    Apacheにfoo.example.jp用の設定を追加する

    $ sudo vi /etc/apache2/sites-available/999-foo.conf
    
    <VirtualHost *:443>
        ServerName foo.example.jp
    
        DocumentRoot /var/www/html
    
        SSLEngine On
        SSLCertificateFile      /etc/ssl/certs/cert.pem
        SSLCertificateKeyFile   /etc/ssl/private/key.pem
    </VirtualHost>
    

    必要に応じてSSLOptionsなども追加する

  5. ApacheのSSLモジュール有効化

    $ sudo a2enmod ssl
    
  6. サイト設定を有効化
    $ sudo a2ensite 999-foo
    
  7. Apache再起動
    $ sudo systemctl restart apache2
    

ブラウザに認証局証明書のインストール

https://foo.example.jp にアクセスすると、証明書の発行元不明エラーが出るのでブラウザに認証局証明書をインストールする

  • Firefox
    firefoxでfoo.example.jpにアクセス
    SSL警告内容詳細
  • Chrome
    chromeでfoo.example.jpにアクセス

Firefoxの場合

  1. Firefoxオプションを開く

    オプション→プライバシーとセキュリティー→証明書

    firefox証明書オプション

  2. 証明書マネージャーを開く

    証明書を表示ボタンを押下して証明書マネージャーを開く

    firefox証明書マネージャー

  3. 認証局証明書をインポート

    1. 認証局証明書タブを選択して、その下のインポートボタンを押下

    2. /tmp/certs/ca.pemをダウンロードやファイル移動などで取得し、それを選択

    3. 証明書のインポートダイアログが表示されるので、この認証局によるウェブサイトの識別を信頼するにチェックしてOKボタンを押下

      認証局証明書のインポート

    正常にインポートできていれば、認証局証明書のリストにtest-caが追加されている

    認証局証明書のインポート後

  4. 再度Firefoxで https://foo.example.jp にアクセス

    認証局証明書のインストール後

Chrome(Windows)の場合

Windows版のChromeはインターネットオプションにある証明書を使用しているため、Chromeの設定から開く方法と、コントロールパネルから開く方法がある

  1. 証明書のインポートウィザートでインポートする証明書を選択する

    その際、デフォルトの拡張子がX.509証明書(*.cer, *.crt)となっていることがあるため、拡張子がpemのca.pemが表示されない

    ファイル名横のリストをすべてのファイル(*.*)に変更することで選択可能になる

    証明書インポートウィザード1

  2. インポートする先(証明書ストア)は信頼されたルート証明機関を選択する

    証明書インポートウィザード2

  3. セキュリティ警告ダイアログが表示されるのでOKを押下

  4. 正常にインポートできていれば、信頼されたルート証明機関のリストにtest-caが追加されている

    Chromeでルート証明書インポート後

  5. https://foo.example.jp にChromeでアクセス

    Chromeでルート証明書インストール後

    Firefoxと違ってエラー(NET::ERR_CERT_COMMON_NAME_INVALID)が表示されたまま

    Chrome58で、HTTPSの自己証明書が NET::ERR_CERT_COMMON_NAME_INVALID になる場合の対応より、サーバ証明書にX509v3 Subject Alternative Nameを含むようにしないといけない

  6. オプションを追加してサーバ証明書を再度生成する

    $ docker run -e SSL_SUBJECT="foo.example.jp" -e SSL_DNS="foo.example.jp" -v /tmp/certs:/certs  paulczar/omgwtfssl
    ----------------------------
    | OMGWTFSSL Cert Generator |
    ----------------------------
    
    --> Certificate Authority
    ====> Using existing CA Key ca-key.pem
    ====> Using existing CA Certificate ca.pem
    ====> Generating new config file openssl.cnf
    ====> Generating new SSL KEY key.pem
    Generating RSA private key, 2048 bit long modulus
    .........................................................+++
    ...................................................+++
    e is 65537 (0x10001)
    ====> Generating new SSL CSR key.csr
    ====> Generating new SSL CERT cert.pem
    Signature ok
    subject=/CN=foo.example.jp
    Getting CA Private Key
    ====> Complete
    keys can be found in volume mapped to /certs
    
    ====> Output results as YAML
    ---
    ca_key: |
      -----BEGIN RSA PRIVATE KEY-----
       :
       :
      -----END RSA PRIVATE KEY-----
    
    ca_crt: |
      -----BEGIN CERTIFICATE-----
       :
       :
       :
      -----END CERTIFICATE-----
    
    ssl_key: |
      -----BEGIN RSA PRIVATE KEY-----
       :
       :
       :
      -----END RSA PRIVATE KEY-----
    
    ssl_csr: |
      -----BEGIN CERTIFICATE REQUEST-----
       :
       :
       :
      -----END CERTIFICATE REQUEST-----
    
    ssl_crt: |
      -----BEGIN CERTIFICATE-----
       :
       :
       :
      -----END CERTIFICATE-----
    

    生成されたサーバ証明書を確認する

    $ openssl x509 -in /tmp/certs/cert.pem -text
    Certificate:
         :
         :
         :
            Issuer: CN = test-ca
         :
         :
         :
            Subject: CN = foo.example.jp
         :
         :
         :
            X509v3 extensions:
                X509v3 Basic Constraints:
                    CA:FALSE
                X509v3 Key Usage:
                    Digital Signature, Non Repudiation, Key Encipherment
                X509v3 Extended Key Usage:
                    TLS Web Client Authentication, TLS Web Server Authentication
                X509v3 Subject Alternative Name:
                    DNS:foo.example.jp, DNS:foo.example.jp
         :
         :
         :
    

    ※ paulczar/omgwtfsslが使用しているベースコンテナのalpineの仕様変更のためか、SSL_DNSオプションを追加しても「X509v3 Subject Alternative Name」が出力されなくなっています。paulczar/omgwtfsslからフォークされたstakater/ssl-certs-generator:1.0を使用すると出力されました(2019/05/09)

    $ docker run -e SSL_SUBJECT="foo.example.jp" -e SSL_DNS="foo.example.jp" -v /tmp/certs:/certs stakater/ssl-certs-generator:1.0
    
  7. 認証局の証明書と鍵が生成済みの場合、サーバ証明書への署名はそれを利用するので認証局証明書は再度インポートする必要はない
    ====> Using existing CA Key ca-key.pem
    ====> Using existing CA Certificate ca.pem
    
  8. 生成したサーバ証明書を上書きする
    $ sudo cp /tmp/certs/cert.pem /etc/ssl/certs/
    $ sudo cp /tmp/certs/key.pem /etc/ssl/private/
    $ sudo systemctl reload apache2
    
  9. Chromeでアクセスして確認

    証明書更新後にChromeでアクセス

広告

gitを1.8にアップデートした結果、HTTP越しでアクセスできなくなった時の対処法

RedmineとSubversion・Git・Mercurialのリポジトリ(ともに同じCentOSサーバ上)の連携(リポジトリの作成とアクセス・認証)

で設定したgitリポジトリにpushした際、

fatal: https://example.jp/repos/git/sample.git/info/refs not found: did you run git update-server-info on the server?

となり、pushできなくなりました。

cloneをしてみると、

Cloning into 'sample'...
fatal: repository 'https://example.jp/repos/git/sample.git/' not found

となり、ブラウザでアクセスしても404 Not Foundという状態に。

調べてみると、apacheのエラーログには

script not found or unable to stat: /usr/libexec/git-core

とあり、
apacheの設定で、

ScriptAlias /repos/git/ /usr/libexec/git-core/git-http-backend/

とある箇所の、/usr/libexec/git-core/git-http-backendが
git 1.8にアップデートした結果なくなった模様。

git-http-backend自体は/usr/binに存在していたので、

ScriptAlias /repos/git/ /usr/bin/git-http-backend/

にしたところ、問題なく動くようになりました。

※git 1.7はrpmforgeリポジトリのものでしたがgit 1.8はepelリポジトリのものを使っていました。