![start-stop-daemon은 SSL Python 스크립트를 서비스로 사용합니다.](https://linux55.com/image/117561/start-stop-daemon%EC%9D%80%20SSL%20Python%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%84%9C%EB%B9%84%EC%8A%A4%EB%A1%9C%20%EC%82%AC%EC%9A%A9%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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 프로그램을 시작할 수도 있습니다.