ウェブサイト検索

Apacheで自己署名SSLを作成し使用する方法


自分自身のSSL証明書に署名することは、通常、内部通信やユーザー向けでないサイトでの暗号化が必要な場合のための証明書機関の簡単な代替手段として行われます。ここでは、Apacheでの設定方法を説明します。

SSL証明書を生成し自己署名する

証明書と対応する秘密鍵を生成するために、openssl ユーティリティを使用します。おそらく、これは Apache の依存関係として既にインストールされているでしょうが、何らかの理由で欠落している場合は、ディストリビューションのパッケージマネージャーからインストールできます。Ubuntu のような Debian ベースのシステムの場合は、次のようになります。

sudo apt-get install openssl

openssl がインストールされた後、次のコマンドで証明書を生成できます:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache.key -out /etc/ssl/certs/apache.crt

openssl は、あなたの組織に関するいくつかの情報を求めてきます。ほとんどの項目は空白のままにしておいても構いませんが、一つ重要なことは「コモンネーム(Common Name)」を記入する必要があり、これをあなたのサーバーのIPアドレスまたはドメイン名に設定してください。

Country Name (2 letter code) []:

State or Province Name (full name) []:

Locality Name (eg, city) []:

Organization Name (eg, company) []:

Organizational Unit Name (eg, section) []:

Common Name (eg, fully qualified host name) []: your_ip_address

Email Address []:

openssl は実行するのに少し時間がかかり、新しいプライベート RSA キーを生成します。このキーは証明書に署名するために使用され、/etc/ssl/private/apache.key に保存されます。証明書自体は /etc/ssl/certs/apache.crt に保存され、1年間有効です。

私たちはまた、Diffie-Hellmanグループを生成する必要があります。これは完全な前方秘匿性に使用され、一時的なセッションキーを生成して、セッションキーが侵害された場合に過去の通信が復号化されないことを保証します。これは内部通信には完全に必要ではありませんが、可能な限り安全にしたい場合は、このステップを省略すべきではありません。なお、これにはApacheバージョン2.4.8以上が必要なので、最新に保っていることを確認してください。

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

これにはしばらく時間がかかります --- サーバーの速さによりますが、約1時間です。ランチを取って、少し後にターミナルに戻ってApacheを設定してください。

自己署名証明書を使用するようにApacheを構成する

物事を簡単にするために、すべての設定をスニペットファイルで行います。Apacheのsites-availableディレクトリに新しいファイルを作成してください(Apacheの設定フォルダーを見つける方法はこちら)。

sudo touch /etc/apache2/conf-available/ssl-params.conf

お気に入りのテキストエディタで開き、次の設定を貼り付けてください:

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH

SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

SSLHonorCipherOrder On

Header always set X-Frame-Options DENY

Header always set X-Content-Type-Options nosniff

SSLCompression off

SSLUseStapling on

SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

SSLSessionTickets Off

SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"

最初のブロックではいくつかのデフォルトのSSLパラメータを設定し、最後の行でApacheをDiffie-Hellmanグループを使用するように構成します。このステップをスキップした場合は、この行を省略できます。

次に、デフォルトのSSLバーチャルホストファイルを開きます。通常、/etc/apache2/sites-available/default-ssl.confにあります。次の行を変更して、証明書とキーのファイルを指すようにします:

SSLCertificateFile /etc/ssl/certs/apache.crt

SSLCertificateKeyFile /etc/ssl/private/apache.key

SSLは今すぐにでも動作するはずですが、空の設定ファイルを修正したため、現在の設定ファイルからいくつかの設定をコピーする必要があるでしょう。ServerName、ServerAdmin、およびDocumentRootディレクティブが正しい場所を指していることを確認する必要があります。

さらに、HTTPトラフィックを暗号化されたHTTPSに転送するためのリダイレクトを設定する必要があります。デフォルトのApache設定ファイルを開き、/etc/apache2/apache2.conf に次の行を追加してHTTPトラフィックを書き換えます。

RewriteEngine On 

RewriteCond %{SERVER_PORT} 80

RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R,L]

ファイアウォールが開いていることを確認することも重要です。HTTPSはポート443を使用し、ポート80ではないため、サーバーに接続するにはそれを開く必要があります。iptablesやUFWを使用している場合、コマンドラインからポートを開くことができます。AWSのようなサービスでサーバーをホスティングしている場合、プロバイダーがポートを開くためのウェブインターフェースを提供していることがあります。

セルフサイン証明書は主にプライベートサーバーで使用されるため、プライベートLANへのアクセスをホワイトリストに登録し、VPNサーバーを使用して接続するのは悪いアイデアではありません。

ポートが開いたら、ブラウザでサイトにアクセスすることでSSL設定をテストできます。すべてが正しく機能していれば、次の警告が表示されるはずです:

これは正常なことなので心配しないでください。この証明書を信頼すると手動で選択する必要があります。これが、公開サイトに自己署名証明書を使用できない理由です。

警告は、あなたのサイトが安全でないことを意味するわけではありません---SSLはまだオンになっていて、トラフィックを暗号化しています。もしあなたのプライベートキーが盗まれると、通信は復号化される可能性がありますが、Diffie-Hellman前方秘匿性を設定すれば、その攻撃ベクトルを無効にすることができるので、完全に安全です。ここでの問題はアイデンティティにあります。Chromeは、あなたが自分が言う通りの人であるか、あなたがそのドメインを所有しているかを確認できません。そのためには「本物」のCAが必要になります。

関連記事: