LSBInitScriptをサービスとして起動すると、スクリプトがSSL証明書として機能するため、SSLエラーが発生します。証明書はスクリプト自体と同じディレクトリにあります。サービスで起動するとエラーが発生しますが、コンソールから呼び出すとエラーが発生しないのはなぜですか?
サービス開始時のSSLエラー:
ubuntu@ip-0-0-0-0:/heartbeat/deviceAPI$ sudo service deviceAPIClient.service start
* DeviceAPIClient process is not running
* Starting the process DeviceAPIClient Traceback (most recent call last):
File "/heartbeat/deviceAPI/DeviceAPIClient.py", line 120, in <module>
main()
File "/heartbeat/deviceAPI/DeviceAPIClient.py", line 90, in main
res = register(instanceName)
File "/heartbeat/deviceAPI/DeviceAPIClient.py", line 40, in register
verify = 'cloud-server-ca-chain.pem'
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 88, in post
return request('post', url, data=data, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 455, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 558, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 185090050] _ssl.c:344: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib
コンソールでPythonスクリプトを起動するときにエラーはありません。
ubuntu@ip-0-0-0-0:/heartbeat/deviceAPI$ /heartbeat/deviceAPI/DeviceAPIClient.py
Successful registering at cloud with 02-57-49-9c-d4
Using API endpoint https://mydomain
Update API endpoint (not used in Demo) https://mydomain.com/device-api
Sending Data to Cloud...
修正する
@mrc02_krの提案に従って、証明書をcloud-server-ca-chain.pem
フォルダに入れました/etc/ssl/certs
。エラーが秘密鍵の問題「SSL_CTX_use_PrivateKey_file」に変更されました。
ubuntu@ip-0-0-0-0:/heartbeat/deviceAPI$ sudo service deviceAPIClient.service start
* DeviceAPIClient process is not running
* Starting the process DeviceAPIClient Traceback (most recent call last):
File "/heartbeat/deviceAPI/DeviceAPIClient.py", line 120, in <module>
main()
File "/heartbeat/deviceAPI/DeviceAPIClient.py", line 90, in main
res = register(instanceName)
File "/heartbeat/deviceAPI/DeviceAPIClient.py", line 40, in register
verify = '/etc/ssl/certs/cloud-server-ca-chain.pem'
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 88, in post
return request('post', url, data=data, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 455, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 558, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 336265218] _ssl.c:355: error:140B0002:SSL routines:SSL_CTX_use_PrivateKey_file:system lib
スクリプトは秘密鍵を使用して自分自身を識別し、クラウドサーバーの証明書を使用してサーバーを識別することに注意してください。
秘密鍵も特別なフォルダに保存する必要がありますか?
アップデート2
秘密鍵をインストール/etc/ssl/private
し、それに応じてスクリプトを調整できます。
ベストアンサー1
証明書への相対パスを指定したため、サービスの起動中にエラーが発生する可能性があります。証明書ファイルには絶対パスが必要です。システムがサービスを開始したときに$ PWDをスクリプトの場所に変更しません。
証明書をコピーできます/etc/ssl/certs
(次のように)。この回答)と変更:
verify = 'cloud-server-ca-chain.pem'
到着する:
verify = '/etc/ssl/certs/cloud-server-ca-chain.pem'
コード(ファイル "/heartbeat/deviceAPI/DeviceAPIClient.py"、40行目)から
初期化スクリプトを変更してディレクトリを証明書の場所に変更し、Pythonプログラムを起動することもできます。