ラズベリーパイで自己署名証明書（オレオレ証明書）を作成してApacheで使用する方法

この記事では、ラズベリーパイを使用して自己署名証明書（オレオレ証明書）を生成し、それをApacheウェブサーバーで使用する手順を紹介します。

## 前提条件

- ラズベリーパイがインターネットに接続されていること
- 基本的なLinuxコマンドの知識

## 手順

### 1. OpenSSLのインストール

まず、OpenSSLをインストールします。ラズベリーパイのターミナルを開いて以下のコマンドを実行してください。

```bash
sudo apt-get update
sudo apt-get install openssl
```

### 2. 自己署名証明書の生成

次に、OpenSSLを使って自己署名証明書を生成します。以下の手順を実行してください。

```bash
# プライベートキーを生成
openssl genpkey -algorithm RSA -out my-private.key

# 証明書署名要求 (CSR) を生成
openssl req -new -key my-private.key -out my-csr.csr
```

コマンドを実行すると、以下のように入力を求められます。適切な情報を入力してください。

```plaintext
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Shibuya
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany
Organizational Unit Name (eg, section) []:IT Department
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:............@gmail.com
```

追加の属性として以下の情報も入力します：

```plaintext
A challenge password []:password
An optional company name []:
```

CSRが生成されたら、次のコマンドで自己署名証明書を生成します。

```bash
openssl x509 -req -days 365 -in my-csr.csr -signkey my-private.key -out my-cert.crt
```

### 3. Apacheのインストールと設定

次に、Apacheウェブサーバーをインストールし、設定します。

```bash
sudo apt-get install apache2
sudo a2enmod ssl
sudo systemctl restart apache2
```

証明書ファイルとキーを適切なディレクトリに配置します。

```bash
sudo mkdir /etc/apache2/ssl
sudo cp my-cert.crt /etc/apache2/ssl/
sudo cp my-private.key /etc/apache2/ssl/
```

仮想ホスト設定ファイルを編集します。

```bash
sudo nano /etc/apache2/sites-available/default-ssl.conf
```

以下の内容を追加または編集します。

```plaintext
<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        ServerName localhost

        SSLEngine on
        SSLCertificateFile      /etc/apache2/ssl/my-cert.crt
        SSLCertificateKeyFile /etc/apache2/ssl/my-private.key

        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>

        BrowserMatch "MSIE [2-6]" \
                nokeepalive ssl-unclean-shutdown \
                downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

    </VirtualHost>
</IfModule>
```

### 4. 仮想ホストの有効化とApacheの再起動

仮想ホストを有効にし、Apacheを再起動します。

```bash
sudo a2ensite default-ssl
sudo systemctl reload apache2
```

### 5. ウェブサーバーへのアクセス

ブラウザから `https://localhost` または `https://192.168.0.???` にアクセスすることで、自己署名証明書を使用したHTTPS接続を確認できます。初回アクセス時には、自己署名証明書であるため、ブラウザから「信頼されていない証明書」という警告が表示されますが、これは正常です。

## 問題解決

### 「この接続は安全ではない」という警告について

自己署名証明書を使用する場合、この警告が表示されるのは正常です。これは、証明書が信頼された認証局（CA）によって署名されていないためです。自己署名証明書は主に開発環境やテスト環境で使用されるもので、本番環境では信頼された認証局から取得した証明書を使用することをお勧めします。

### 応答がない場合の対処

`https://localhost` で応答がないが `https://192.168.0.???` で応答がある場合、以下の手順を試してください。

1. **`/etc/hosts` ファイルの編集**

   `localhost` を正しいIPアドレスにマッピングします。

   ```bash
   sudo nano /etc/hosts
   ```

   ファイルに以下の行があることを確認してください（なければ追加してください）：

   ```plaintext
   127.0.0.1       localhost
   192.168.0.???   localhost
   ```

2. **Apache設定の確認**

   `default-ssl.conf` ファイルで `ServerName` を `localhost` に設定している場合、`192.168.0.???` に変更してみてください。

   ```bash
   sudo nano /etc/apache2/sites-available/default-ssl.conf
   ```

   以下のように変更します：

   ```plaintext
   <IfModule mod_ssl.c>
       <VirtualHost _default_:443>
           ServerAdmin webmaster@localhost
           DocumentRoot /var/www/html

           ServerName 192.168.0.???

           SSLEngine on
           SSLCertificateFile      /etc/apache2/ssl/my-cert.crt
           SSLCertificateKeyFile /etc/apache2/ssl/my-private.key

           <FilesMatch "\.(cgi|shtml|phtml|php)$">
                   SSLOptions +StdEnvVars
           </FilesMatch>
           <Directory /usr/lib/cgi-bin>
                   SSLOptions +StdEnvVars
           </Directory>

           BrowserMatch "MSIE [2-6]" \
                   nokeepalive ssl-unclean-shutdown \
                   downgrade-1.0 force-response-1.0
           BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

       </VirtualHost>
   </IfModule>
   ```

   変更を保存したら、Apacheを再起動します。

   ```bash
   sudo systemctl reload apache2
   ```

3. **ブラウザのキャッシュクリア**

   変更後にブラウザのキャッシュをクリアして、再度アクセスしてみてください。

## まとめ

ラズベリーパイで自己署名証明書を生成し、Apacheウェブサーバーで使用する手順を紹介しました。自己署名証明書は手軽に作成でき、開発やテストの際に役立ちますが、本番環境での使用には注意が必要です。信頼性の高い認証局から証明書を取得することを検討してください。
次回はLet's Encryptを用いる方法について解説したいと思います。
```