OpenSSL 0.9.8で作成した鍵をOpenSSL 1.1.1 でも使う方法

* `@SECLEVEL=0`が必要。

## nginx

```diff:/etc/nginx/conf.d/default.conf
  server {
      listen       80;
      listen       443 ssl;
      server_name  localhost;
  
      #ssl_verify_client      on;
      ssl_certificate        /etc/nginx/certs/server.crt;
      ssl_certificate_key    /etc/nginx/certs/server.key;
      ssl_client_certificate /etc/nginx/certs/ca.crt;
+     ssl_ciphers    'HIGH:!aNULL:!MD5@SECLEVEL=0';
      # IE11だとなぜかTLSv1.2を有効にしていると接続できない。
+     ssl_protocols  TLSv1 TLSv1.1 TLSv1.3;

      location / {
          root   /usr/share/nginx/html;
          index  index.html index.htm;
      }
  
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
          root   /usr/share/nginx/html;
      }
  
  }
```


## Ubuntu 20.04 (OepnSSL 1.1.1)

* SSLCipherSuite にて`@SECLEVEL=0` の指定を追加する。

```diff:/etc/apache2/sites-available/default-ssl.conf
 <IfModule mod_ssl.c>
         <VirtualHost _default_:443>
                 ServerAdmin webmaster@localhost
 
                 DocumentRoot /var/www/html
 
                 ErrorLog ${APACHE_LOG_DIR}/error.log
                 CustomLog ${APACHE_LOG_DIR}/access.log combined
 
                 SSLEngine on
 
                 SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                 SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
-                SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
+                SSLCipherSuite @SECLEVEL=0:kEECDH:kRSA:kEDH:kPSK:kDHEPSK:kECDHEPSK:!DES:!RC2:!IDEA:-SEED:!eNULL:!aNULL:!MD5:-SHA384:-CAMELLIA:-ARIA:-AESCCM8
                 # もしくは 
+                SSLCipherSuite @SECLEVEL=0:HIGH:MEDIUM:!MD5:!RC4:!3DES
                 <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                 SSLOptions +StdEnvVars
                 </FilesMatch>
                 <Directory /usr/lib/cgi-bin>
                                 SSLOptions +StdEnvVars
                 </Directory>
 
         </VirtualHost>
 </IfModule>
```


## Ubuntu 16.04 (OepnSSL 1.0.2e)

* OpenSSL 1.1.1で出来ていた `@SECLEVEL=0:` の指定は出来ないので注意。
* CentOS7も OpenSSL 1.0.2の様子。
* OpenSSL 1.0.2までは XPのIE6 でアクセスが可能。(※ `LOW`の指定が1.1.0で削除された。[40ビット及び56ビット暗号のサポートをlibsslから削除](https://ja.wikipedia.org/wiki/OpenSSL))
* ブラウザごとの使用できる暗号化bitは [List of browsers that support 128-bit and 256-bit encryption](https://knowledge.digicert.com/solution/SO12413.html)
* [私が愛した openssl (SSL/TLS 編) - してみんとて](https://stimming-today.hatenablog.jp/entry/20120910/1347285980) は随分まとまっていて感謝

```diff:/etc/apache2/sites-available/default-ssl.conf
 <IfModule mod_ssl.c>
         <VirtualHost _default_:443>
                 ServerAdmin webmaster@localhost
 
                 DocumentRoot /var/www/html
 
                 ErrorLog ${APACHE_LOG_DIR}/error.log
                 CustomLog ${APACHE_LOG_DIR}/access.log combined
 
                 SSLEngine on
 
                 SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                 SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
+                SSLCipherSuite kEECDH:kRSA:kEDH:kPSK:kDHEPSK:kECDHEPSK:!DES:!RC2:!IDEA:-SEED:!eNULL:!aNULL:!MD5:-SHA384:-CAMELLIA:-ARIA:-AESCCM8
 
                 <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                 SSLOptions +StdEnvVars
                 </FilesMatch>
                 <Directory /usr/lib/cgi-bin>
                                 SSLOptions +StdEnvVars
                 </Directory>
 
         </VirtualHost>
 </IfModule>
```


## CentOS 8

* mod_ssl の SECLEVEL を下げれば動く。
* [/docs/man1.1.1/man3/SSL_CTX_set_security_level.html](https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_security_level.html)

> Level 0
> Everything is permitted. This retains compatibility with previous versions of OpenSSL.

Apacheをhttps有効で起動しようとするも起動できない場合。
`/var/log/httpd/ssl_error_log`を確認。

### key too smallへの対処

> SSL Library Error: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small

と出た場合、`SSLCertificateKeyFile`などを旧サーバーからコピーして動かした場合だと思います。

なお、apacheでの定義は以下 `/etc/httpd/conf.d/ssl.conf`

```apache:/etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/pki/tls/certs/localhost.crt

SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
```

### エラーメッセージ確認

```sh
# 起動
/usr/sbin/httpd -D FOREGROUND

# ログ確認
tail -f /var/log/httpd/ssl_error_log
```

> SSL Library Error: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small

CentOS 8 (7?) 以降、このエラーが出る。

* [SSL Key to Small?? · Issue #126 · debauchee/barrier](https://github.com/debauchee/barrier/issues/126)

### 対処 (SECLEVELを下げる)

debianの場合、以下

```diff:/etc/ssl/openssl.cnf
- CipherString = DEFAULT@SECLEVEL=2
+ CipherString = DEFAULT@SECLEVEL=1
```


Ubuntu21.04の場合 [Ubuntu 20.04 - how to set lower SSL security level? - Ask Ubuntu](https://askubuntu.com/questions/1233186/ubuntu-20-04-how-to-set-lower-ssl-security-level)

※ `openssl version -a` でビルド時のオプションがわかる。md5はopenssl 1.1.1では含まれていない。

```apache:/etc/ssl/openssl.cnf
# ファイルの先頭に記述
openssl_conf = openssl_init

(略)

# ファイルの最後に記述
[openssl_init]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
CipherString = DEFAULT@SECLEVEL=0
```



CentOS 8 の場合、以下

* [crypto policy - とみぞーノート](https://wiki.bit-hive.com/tomizoo/pg/crypto%20policy)

```diff:/etc/crypto-policies/config
- DEFAULT
+ LEGACY
```

```sh:設定反映
update-crypto-policies
```

* `/etc/crypto-policies/back-ends/*.config` が一斉に修正される。

もしくは[Strong crypto defaults in RHEL 8 and deprecation of weak crypto algorithms - Red Hat Customer Portal](https://access.redhat.com/articles/3642912)

`update-crypto-policies --set LEGACY`

### ca md too weak への対処

> SSL Library Error: error:140AB18E:SSL routines:SSL_CTX_use_certificate:ca md too weak

この場合は、SECLEVEL を さらに下げる。

```diff:/etc/crypto-policies/back-ends/openssl.config
- @SECLEVEL=1:kEECDH:kRSA:kEDH:kPSK:kDHEPSK:kECDHEPSK:!DES:!RC2:!IDEA:-SEED:!eNULL:!aNULL:!MD5:-SHA384:-CAMELLIA:-ARIA:-AESCCM8
+ @SECLEVEL=0:kEECDH:kRSA:kEDH:kPSK:kDHEPSK:kECDHEPSK:!DES:!RC2:!IDEA:-SEED:!eNULL:!aNULL:!MD5:-SHA384:-CAMELLIA:-ARIA:-AESCCM8
```

* `update-crypto-policies` を実施しても `/etc/crypto-policies/back-ends/openssl.config`の内容は変わらなかった。
    * `update-crypto-policies --set LEGACY` の場合は書き換わる。


## IPA

* https://www.ipa.go.jp/files/000045966.pdf

![スクリーンショット_2020-04-20_13-56-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/c03a3a83-9072-af09-7eff-d0a40c1c06b5.png)


## nginx のログに追加

```diff:/etc/nginx/nginx.conf
  http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
+                     '$ssl_client_verify '
+                     '$ssl_cipher '
+                     '$ssl_protocol '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
  }
```

* $ssl_client_verify
    * `SUCCESS` か `NONE`
* $ssl_cipher
    * ECDHE-RSA-AES128-GCM-SHA256
* $ssl_protocol
    * TLSv1.2