現状の環境からの模索
プライベート写真をネット環境に公開しているWebサーバー用に、アップロードするデーター等を作成したり、動作の検証をするために別の機器を立上げ、そこにデーターを変換するアプリや検証のために apache http サーバーを設定して利用しています。
古くて遅いノートPC
別の機器としての作業は、現状は非力で処理の遅い古いノートPCでの作業です。基本的に写真をカメラで写し、居た場所をGPSロガーで収集して、ノートPCに移して加工しています。
動作の検証もノートPC内に立上げた Web サーバー apache で行っているため、全てがワンパッケージで完結しているので、まとまっていて操作性は良いのですが、非力でストレスになってます。
更に非効率なos切替
GPSロガーはアプリがWindows対応なのでそれに従い、写真に位置情報を追加したり公開用にサイズを縮小したりの加工は Linux のバッチ処理で加工しています。OSの切替は昔からあるオーソドックスなデュアルブートを利用しています。切替に時間が掛かりとても効率が悪いです。
データー加工とWebサーバー
新しいノートPCを購入するとか、速くて効率的な作業環境に移行できればストレスも減るのですが、何よりもまず資金が必要な事だし、今ある機器で分散できないものかと模索しています。
機器の分散を模索
データー変換や検証のWebサーバーを別に立て、リモート環境を作ろうかと模索していて、分散対象のサーバーに利用する予定の機器は、サーバーなのに20分で停止してしまったり、致命的な問題はapache が立上げできません。
サーバーとしての機能
サーバーが 20分で停止する問題は、別にまとめた Linux Ubuntu のバージョンアップの仕様が問題でしたが、その後の状況から解決できました。
(systemd の対策で停止を解決)
Webサーバーを設定
検証用Webサーバーとして実績のあるノートPCから apache のサイト情報等のコピーを行ったのに立上げでエラーになります。
$ sudo systemctl start apache2
Job for apache2.service failed because the control process exited with error code.
See "systemctl status apache2.service" and "journalctl -xe" for details.
ログ等を確認すると、https を設定するために使用している認証情報に問題があるらしく、今までに実績のあるファイルをコピーして手を抜こうと考えたのですが、定義されたキーが短過ぎるのが原因らしいです。
$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2021-03-14 13:35:13 JST; 11min ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 561706 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILURE)
3月 14 13:35:13 big-book systemd[1]: Starting The Apache HTTP Server...
3月 14 13:35:13 big-book apachectl[561721]: AH00558: apache2: Could not reliably determine the server's fully>
3月 14 13:35:13 big-book apachectl[561706]: Action 'start' failed.
3月 14 13:35:13 big-book apachectl[561706]: The Apache error log may have more information.
3月 14 13:35:13 big-book systemd[1]: apache2.service: Control process exited, code=exited, status=1/FAILURE
3月 14 13:35:13 big-book systemd[1]: apache2.service: Failed with result 'exit-code'.
3月 14 13:35:13 big-book systemd[1]: Failed to start The Apache HTTP Server.
lines 1-13/13 (END)
error.log を開いてみると、:ee key too small と出ているので証明書の key が小さいのが原因と思われます。
$ less /var/log/apache2/error.log
[Sun Mar 14 13:35:13.253066 2021] [ssl:emerg] [pid 561721:tid 140387924089920] AH02562: Failed to configure certificate sunao-mita.pgw.jp:443:0 (with chain), check /etc/apache2/ssl/server.cert
[Sun Mar 14 13:35:13.253158 2021] [ssl:emerg] [pid 561721:tid 140387924089920] SSL Library Error: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small
AH00016: Configuration Failed
/var/log/apache2/error.log (END)
オレオレ証明書の作成
昔々、ネットの情報を参考にさせて頂きオレオレ証明書を作成したことがありました。それを流用して暫く使えていたのですが今回はエラーになってしまいました。証明書の条件も年月と共に厳しくなっているので少しずつ対応していかないといけません。
ネットを色々と調べ内容の重げなサイトを見付けました。ほぼ丸コピーで試してみようと思います。
https://one-it-thing.com/63/
まずは、オレオレ認証局かな
あまり意識したことがなかったけど OpenSSL のバージョンの確認あたりから進めていこうと思っています。
$ openssl version OpenSSL 1.1.1f 31 Mar 2020
root ユーザーになって、作業用に /openssl のディレクトリを作成して、そこに移動してサンプルをコピーして、作業を進めることにします。
$ sudo su - # mkdir /openssl # cd /openssl # cp /etc/ssl/openssl.cnf ./
作業用ディレクトリをカレントに定義、シリアルナンバーファイルを作成しておきます。
# vi openssl.cnf
〜途中省略〜
dir = ./ # Where everything is kept
〜途中省略〜
# touch ./index.txt
# echo 00 > ./serial
CA秘密鍵を作成します。途中でパスワードを2回打鍵して継続します。
# openssl genrsa -aes256 -out ./cakey.pem 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ......................................................+++++ .................................................................+++++ e is 65537 (0x010001) Enter pass phrase for ./cakey.pem: (パスワードを入力して備忘しておく) Verifying - Enter pass phrase for ./cakey.pem:
CA証明書リクエストを作成
CA とは証明書認証局なのでしょうか、あまり理解できていませんが、ネット情報を参考に進めます。
# openssl req -new -key ./cakey.pem -config ./openssl.cnf -out cacert.csr Enter pass phrase for ./cakey.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]:Gunma Locality Name (eg, city) []:Fujioka Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mita Organizational Unit Name (eg, section) []:Mita-sec Common Name (e.g. server FQDN or YOUR name) []:192.168.11.5 Email Address []:sunao.mita@nifty.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
理解をしていませんが、X509 v3 拡張領域に入れるために、v3_ca.txt を作成するのだそうです。
# vi v3_ca.txt
basicConstraints = critical, CA:true
keyUsage = critical, cRLSign, keyCertSign
subjectKeyIdentifier=hash
CA証明書作成
ここでやっとCA証明書の作成になるようです。
# openssl ca -in cacert.csr -selfsign -keyfile ./cakey.pem -notext -config ./openssl.cnf -outdir . -days 3650 -extfile v3_ca.txt -out cacert.pem Using configuration from ./openssl.cnf Enter pass phrase for ./cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: Mar 14 06:43:10 2021 GMT Not After : Mar 12 06:43:10 2031 GMT Subject: countryName = JP stateOrProvinceName = Gunma organizationName = Mita organizationalUnitName = Mita-sec commonName = 192.168.11.5 emailAddress = sunao.mita@nifty.com X509v3 extensions: X509v3 Basic Constraints: critical CA:TRUE X509v3 Key Usage: critical Certificate Sign, CRL Sign X509v3 Subject Key Identifier: CD:2A:04:41:9A:3D:D3:23:1E:BE:C6:FE:FD:E4:3C:8D:1D:9C:1A:79 Certificate is to be certified until Mar 12 06:43:10 2031 GMT (3650 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
できあがった証明書をテキストで確認してみて、X509v3 の記述があることを確認するのだそうです。
# openssl x509 -in cacert.pem -text
〜省略〜
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage: critical
Certificate Sign, CRL Sign
X509v3 Subject Key Identifier:
CD:2A:04:41:9A:3D:D3:23:1E:BE:C6:FE:FD:E4:3C:8D:1D:9C:1A:79
〜省略〜
オレオレ サーバー証明書
サーバー秘密鍵の作成
# openssl genrsa -aes256 -out ./server.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ........................................................................................................................................................................................................................+++++ ..........................+++++ e is 65537 (0x010001) Enter pass phrase for ./server.key: (パスワードを入力して備忘しておく) Verifying - Enter pass phrase for ./server.key:
サーバー証明書リクエスト作成
サーバー証明書リクエストの作成を行います。個人使用なので CA証明書と内容は同じで良いようです。
# openssl req -new -key ./server.key -config ./openssl.cnf -out server.csr Enter pass phrase for ./server.key: (秘密鍵に設定したパスワード) 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]:Gunma Locality Name (eg, city) []:Fujioka Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mita Organizational Unit Name (eg, section) []:Mita-sec Common Name (e.g. server FQDN or YOUR name) []:sunao-mita.pgw.jp Email Address []:sunao.mita@nifty.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
証明書のX509 v3拡張情報
# vi v3_server.txt
[SAN]
basicConstraints = CA:false
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
authorityKeyIdentifier=keyid,issuer
subjectAltName=@alt_names
basicConstraints=CA:FALSE
[alt_names]
DNS.1=192.168.11.2
IP.1=192.168.11.5
IP.2=127.0.0.1
サーバー証明書の作成
# openssl ca -in server.csr -config openssl.cnf -keyfile ./cakey.pem -outdir . -extfile v3_server.txt -extensions SAN -out server.crt -days 3650 Using configuration from openssl.cnf Enter pass phrase for ./cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Mar 14 07:43:48 2021 GMT Not After : Mar 12 07:43:48 2031 GMT Subject: countryName = JP stateOrProvinceName = Gunma organizationName = Mita organizationalUnitName = Mita-sec commonName = sunao-mita.pgw.jp emailAddress = sunao.mita@nifty.com X509v3 extensions: X509v3 Key Usage: critical Digital Signature, Key Encipherment X509v3 Extended Key Usage: TLS Web Server Authentication X509v3 Authority Key Identifier: keyid:CD:2A:04:41:9A:3D:D3:23:1E:BE:C6:FE:FD:E4:3C:8D:1D:9C:1A:79 X509v3 Subject Alternative Name: DNS:192.168.11.2, IP Address:192.168.11.5, IP Address:127.0.0.1 X509v3 Basic Constraints: CA:FALSE Certificate is to be certified until Mar 12 07:43:48 2031 GMT (3650 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
確認のためにできたサーバー証明書をテキストダンプして確認します。
# openssl x509 -in server.crt -text
〜省略〜
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Authority Key Identifier:
keyid:CD:2A:04:41:9A:3D:D3:23:1E:BE:C6:FE:FD:E4:3C:8D:1D:9C:1A:79
X509v3 Subject Alternative Name:
DNS:192.168.11.2, IP Address:192.168.11.5, IP Address:127.0.0.1
X509v3 Basic Constraints:
CA:FALSE
〜省略〜
パスなしサーバー秘密鍵の生成
# openssl rsa -in ./server.key -out nopass_server.key Enter pass phrase for ./server.key: writing RSA key
作業ディレクトリ内にできた成果
作業ディレクトリ内には不要な作業ファイルも含め、色々なファイルが残っていますが、必要なものは次の4点のようです。
- CA秘密鍵:cakey.pem …サーバ証明書を作るためで、不使用
- CA証明書:cacert.pem …サーバーを利用する端末のブラウザで使用
- サーバ秘密鍵:nopass_server.key …サーバーの apache に指定
- サーバ証明書:server.crt …サーバーの apache に指定
サーバー sslの設定に
定義されている場所が複数あり、その1箇所を次に示します。同様に sites-available 内のssl に関連するファイルを確認する必要があります。
# vi /etc/apache2/sites-available/default-ssl.conf
〜省略〜
SSLCertificateFile /openssl/server.crt
SSLCertificateKeyFile /openssl/nopass_server.key
〜省略〜
コンフィグファイルの確認
$ apache2ctl configtest AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message Syntax OK
apache2 の起動と確認
Syntax OK となっていても、実際に start でエラーが出て起動しない場合が多いので原因をじっくり潰します。
$ sudo systemctl start apache2 $ sudo systemctl status apache2 ● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2021-03-14 21:52:25 JST; 28s ago Docs: https://httpd.apache.org/docs/2.4/ Process: 877445 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS) Main PID: 877471 (apache2) Tasks: 57 (limit: 4413) Memory: 8.2M CGroup: /system.slice/apache2.service ├─877471 /usr/sbin/apache2 -k start ├─877472 /usr/sbin/apache2 -k start ├─877473 /usr/sbin/apache2 -k start ├─877474 /usr/sbin/apache2 -k start └─877475 /usr/sbin/apache2 -k start 3月 14 21:52:25 big-book systemd[1]: Starting The Apache HTTP Server... 3月 14 21:52:25 big-book apachectl[877454]: AH00558: apache2: Could not reliably determine the server's fully> 3月 14 21:52:25 big-book systemd[1]: Started The Apache HTTP Server. lines 2-18/18 (END)
何とか最後に起動できました。