νλ μλμμ μμ²μ μ¬μ©νλ jenkinsapi λͺ¨λμ μ¬μ©νκ³ μμ΅λλ€. SSLμ μ¬μ©νλ jenkins μλ²λ₯Ό κ°λ¦¬ν€λ©° μ¦μ μ¬μ©νλ €κ³ νλ©΄ λ€μκ³Ό κ°μ κ²°κ³Όκ° λνλ©λλ€.
SSLError: [Errno 1] _ssl.c:504: error:14090086 :SSL 루ν΄:SSL3_GET_SERVER_CERTIFICATE :μΈμ¦μ νμΈ μ€ν¨
jenkinsapiλ verify=Falseλ₯Ό μ€μ νλ νν¬λ₯Ό μ 곡νμ§ μμ΅λλ€. jenkins μλ²μμ μΈμ¦μλ₯Ό μ μ₯νκ³ μ΄λ₯Ό κ°λ¦¬ν€λλ‘ REQUESTS_CA_BUNDLE νκ²½ λ³μλ₯Ό μ€μ νλ €κ³ μλνμ§λ§ μ¬μ ν λμΌν μ€λ₯κ° λ°μνμ΅λλ€. λλ λν certifiλ₯Ό μ€μΉνλ €κ³ μλνμ§λ§ μ°¨μ΄κ° μμ΅λλ€.
jenkinsapi μ½λλ₯Ό ν΄νΉν μ μλ€λ κ²μ μκ³ μμ§λ§ λ΄ μ½λμ λͺ¨λ μ¬μ©μκ° λμΌν μμ μ μνν΄μΌ νκΈ° λλ¬Έμ λ§μ‘±μ€λ½μ§ μμ΅λλ€. λ΄κ° λκ°λ₯Ό κ°κ³Όνκ³ μμ΅λκΉ?
μ μ₯λ μΈμ¦μκ° μ΄λ»κ² μκ²Όλμ§ λ³΄μ¬μ£Όμκ² μ΅λκΉ? μ¬κΈ°μ κ°λ¨ν λΆμ¬λ£μ μ μμ΄μΌ ν©λλ€.
μλ΅ν΄ μ£Όμ μ κ°μ¬ν©λλ€. μΈμ¦μλ₯Ό λ€μ μ μ₯νκ³ νμ¬ μλνκ³ μμ΅λλ€.
μ κΈΈ! λ΄κ° λ무 빨리 λ§νλ€. λ€μμ μΈμ¦μμ λλ€.
-----μΈμ¦μ μμ-----
MIIGQDCCBSigAwIBAgIKWQnHpQAAAAAIzjANBgkqhkiG9w0BAQUFADBZMRMwEQYK
CZImiZPyLGQBGRYDY29tMRQwEgYKCZImiZPyLGQBGRYEZWJheTEUMBIGCgmSJomT
8ixkARkWBGNvcnAxFjAUBgNVBAMTDUFNRVItU1NMQ0EtMDIwHhcNMTIxMTE4MDUz
MTA4WhcNMTQxMTE4MDUzMTA4WjB1MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2Fs
awZvcm5pYTERMA8GA1UEBxMIU2FuIEpvc2UxFDASBgNVBAoTC1BheVBhbCBJbmMu
MQwwCgYDVQQLEwNDRUkxGjAYBgNVBAMTEWZ1c2lvbi5wYXlwYWwuY29tMIIBIjan
BgkqhkiG9w0BAQEFAOCAQ8AMIIBCgKCAQEAwOZj4ezQ/k5vTU6E63uNsP+LZjeg
4kTEUwSzFsRj3NImQdfOrQ7W7S386ep2EZZqmjevO6HBzkaXaYYQ0GSqthdspd53
A8GnLi0q43oFy+kyAc2ItAM0SH/GOt0J+5EUdS12S821WMiwebHInSHINAjexAHN
Sm87yXCyO8mZ3Jzc3+PFraveF9WFmE0NLZUDpEMxq17K3/6iGLsVO/YZkUpaAXNJ
962fGrIZ4xcvK//S903ehloKwQnRCgtNoGCmvsoDftbYye6LfRh/rH3xWFXIUmWG
Wib27ZwAgbyxz2FPcexie4FB/IzbH2l9Tp5rzGWfs1159VmVhQ/L3EJIDQIDAQAB
o4IC7DCCAugwHQYDVR0OBBYEFMkZJD5QaahE21k37UvPIP1VmZ1SMB8GA1UdIwQY
MBAAFLI24M3s4ViBTJbTf1lWAEsUzehVMIIBDQYDVR0fBIIBBDCCAQAwgf2ggfqg
gfeGgb9sZGFwOi8vL0NOPUFNRVItU1NMQ0EtMDIsQ049QU1FUi1TU0xDQS0wMixD
Tj1DRFAsQ049UHVibGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049
Q29uZmlndXJhdGlvbixEQz1jb3JwLERDPWViYXksREM9Y29tP2NlcnRpZmljYXRl
UmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFzcz1jUkxEaXN0cmlidXRpb25Q
b2ludIYzaHR0cDovL3BraS5jb3JwLmViYXkuY29tL0NlcnREYXRhL0FNRVItU1NM
Q0EtMDIuY3JsMIIBTgYIKwYBBQUHAQEEggFAMIIBPDCBsQYIKwYBBQUHMAKGgaRs
ZGFwOi8vL0NOPUFNRVItU1NMQ0EtMDIsQ049QUlBLENOPVB1YmxpYyUyMEtleSUy
MFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9Y29ycCxE
Qz1lYmF5LERDPWNvbT9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2Vy
dGlmaWNhdGlvbkF1dGhvcml0eTBbBggrBgEFBQcwAoZPaHR0cDovL3BraS5jb3Jw
LmViYXkuY29tL0NlcnREYXRhL0FNRVItU1NMQ0EtMDIuY29ycC5lYmF5LmNvbV9B
TUVSLVNTTENBLTAyLmNydDapBggrBgEFBQcwAYYdaHR0cDovL3BraS5jb3JwLmVi
YXkuY29tL29jc3AwIQYJKwYBBAGCNxQCBBQeEgBXAGUAYgBTAGUAcgB2AGUAcjAL
BgNVHQ8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQEFBQAD
ggEBAFj5s9SdtRpXLz03BjPFsDvQPzoyML9ngHL5zyYMlotUpD7d+aO41Q2E2+LO
REFbd3NAnLT3MfWMHAxNaZ4TRUog1fFJmLJxHTBax5fpmY8YAhiPjQIO+IZOUZO3
4lAwXKsq4ylWS2tlbxL56mPngN2EzLisWgIZqJSx9zd1K/LvKyvs/R3wxBerhTN5
LyHFf9/ByUhaqgIE8jydM4qiS8o3zxjrPAIbi6lnZjktkguYTSAKDoHb17BkNoPr
mU1xDtD1/FuX22dfHpqmJSYVubPVfUTvGB3julT2GNNREoHsQI7wmgFBMaTdvJq
42DUnHIK0pdMzb2urxL/toZ3mHY=
-----μ’
λ£ μ¦λͺ
μ--------
μμΆμ (κ°μ₯ μ΅κ·Ό νΈμΆ λ§μ§λ§):
νμΌ "goals.py", 3ν,
J = api.Jenkins('https://fusion.[νΈμ§λ¨].com/jenkins/')
νμΌ "C:\python27\lib\site-packages\jenkinsapi\jenkins.py", 35ν, init
μ ν¨μ€λ² μ΄μ€. μ΄κΈ°ν (μ체, baseurl)
νμΌ "C:\python27\lib\site-packages\jenkinsapi\jenkinsbase.py", 27ν, μ΄κΈ°ν
self.poll()
μ€λ¬Έ μ‘°μ¬μμ "C:\python27\lib\site-packages\jenkinsapi\jenkinsbase.py" νμΌ, 49ν
self._data = self._poll()
νμΌ "C:\python27\lib\site-packages\jenkinsapi\jenkinsbase.py", 53ν, _poll
λ°ν self.get_data(url)
get_dataμ νμΌ "C:\python27\lib\site-packages\jenkinsapi\jenkinsbase.py", 57ν
μλ΅ = requester.get_url(url)
get_urlμ "C:\python27\lib\site-packages\jenkinsapi\utils\requester.py" νμΌ, 59ν
μμ²μ λ°νν©λλ€ .get (url,
νμΌ "C:\python27\lib\site-packages\requests\adapters.py", 331ν, 보λ΄κΈ°
SSLError(e) λ°μ
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086 :SSL 루ν΄:SSL3_GET_SERVER_CERTIFICATE :μΈμ¦μ νμΈ μ€ν¨
jenkinsapiλ₯Ό κ±°μΉμ§ μκ³ μμ²μ μ¬μ©νμ¬ μ§μ μ°κ²°μ μλν μ μμ§λ§ μΈμ¦μλ₯Ό μμ²μ μμ νκ² μ λ¬ν μ μμ΅λλ€.
r=requests.get(url,verify=certfile)
SSLError: [Errno 1] _ssl.c:504: error:14090086 :SSL 루ν΄:SSL3_GET_SERVER_CERTIFICATE :μΈμ¦μ νμΈ μ€ν¨
r=requests.get(url,cert=certfile)
SSLError: [Errno 336265225] _ssl.c:351: error:140B0009 :SSL 루ν΄:SSL_CTX_use_PrivateKey_file :PEM lib
κ°μΈ ν€κ° μμ΄μΌ νλ€λ λ»μΈκ°μ? μλ² μμ μκ° νμ©ν μ§ μμ¬λ©λλ€.
μ£μ‘ν©λλ€. λ λ²μ§Έ λΆλΆμ 무μνμμμ€. "cert"λ₯Ό μ§μ νλ κ²μ μ¬κΈ°μ λ¬Έμ κ° μλ μλ²μ μμ μ μΈμ¦νλ κ²μμ μμμ΅λλ€.
μ΄μ μ°λ¦¬λ λ¬Έμ κ° μΈμ¦μμ μλ€λ κ²μ μκ³ μμ΅λλ€ :-)
μΈμ¦μκ° μλ² μμ²΄κ° μλλΌ CAμμ μ 곡λλ κ²½μ°: μΆλ ₯ 체μΈμ΄ μλ£λμμ΅λκΉ?
μΈμ¦μλ₯Ό λ΄λ³΄λΈ λΈλΌμ°μ μ μ΄ μ²΄μΈμ΄ νμλμ΄μΌ ν©λλ€.
μΈμ¦μ μμ²μ νμΈνλ €λ©΄ μμ ν 체μΈμ΄ νμν©λλ€. λ§μ§λ§ μμλ μλ²μμ μ μ‘λλ©° λ£¨νΈ μΈμ¦μλ§ νμΌμ μ μ₯νλ€κ³ κ°μ ν©λλ€.
루νΈμ 리ν μ¬μ΄μλ μ¬μ ν λͺ¨λ μΈμ¦μκ° νμν©λλ€. κ·Έκ²λ€μ 리ν μΈμ¦μμ ν¨κ» μλ²μμ 보λ΄κ±°λ μΈμ¦μ νμΌμ μΆκ°ν μ μμ΄μΌ ν©λλ€.
κ°μ¬ν©λλ€-λλμ΄ μλνκ² λμμ΅λλ€! μμ½νλ©΄ μ΄κ²μ΄ λ€λ₯Έ μ¬λμκ² λμμ΄ λλ κ²½μ°: 체μΈμ λͺ¨λ μΈμ¦μλ₯Ό μλ² μ체μμ 루νΈλ‘ λ΄λ³΄λ΄κ³ κ° μΈμ¦μλ₯Ό base64 νμμΌλ‘ μ μ₯ν λ€μ λͺ¨λ μΈμ¦μλ₯Ό λ¨μΌ νμΌμ 볡μ¬νκ³ νκ²½μ μ€μ ν΄μΌ νμ΅λλ€. REQUESTS_CA_BUNDLE λ³μλ₯Ό μ§μ ν©λλ€.
λμμ μ£Όμ μ λ€μ ν λ² κ°μ¬λ립λλ€!
λ€λ₯Έ Google μ§μμ κ²½μ° λ€μμ μ¬μ©νμ¬ jenkinsapiμμ SSL νμΈμ λΉνμ±νν μ μμ΅λλ€.
from jenkinsapi.jenkins import Jenkins
from jenkinsapi.utils.requester import Requester
j = Jenkins(base_url, requester=Requester(username, password, baseurl=base_url, ssl_verify=False))
λμΌν λ¬Έμ κ° λ°μνκ³ SSL μΈμ¦μ νμΈ μ€ν¨ λ¬Έμ κ° λ°μνμ΅λλ€. boto3 μ½λλ₯Ό κ²ν νμ¬ REQUESTS_CA_BUNDLEμ΄ μ€μ λμ§ μμμΌλ―λ‘ μλμΌλ‘ μ€μ νμ¬ λ λ¬Έμ λ₯Ό λͺ¨λ μμ νμ΅λλ€.
from boto3.session import Session
import os
# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
'/etc/ssl/certs/',
'ca-certificates.crt')
# centos
# 'ca-bundle.crt')
aws-cliμ κ²½μ° ~/.bashrcμμ REQUESTS_CA_BUNDLEμ μ€μ νλ©΄ μ΄ λ¬Έμ κ° ν΄κ²°λ κ² κ°μ΅λλ€(λ΄ aws-cliκ° μμ΄ μλνκΈ° λλ¬Έμ ν μ€νΈλμ§ μμ).
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
κ°μ₯ μ μ©ν λκΈ
λμΌν λ¬Έμ κ° λ°μνκ³ SSL μΈμ¦μ νμΈ μ€ν¨ λ¬Έμ κ° λ°μνμ΅λλ€. boto3 μ½λλ₯Ό κ²ν νμ¬ REQUESTS_CA_BUNDLEμ΄ μ€μ λμ§ μμμΌλ―λ‘ μλμΌλ‘ μ€μ νμ¬ λ λ¬Έμ λ₯Ό λͺ¨λ μμ νμ΅λλ€.
aws-cliμ κ²½μ° ~/.bashrcμμ REQUESTS_CA_BUNDLEμ μ€μ νλ©΄ μ΄ λ¬Έμ κ° ν΄κ²°λ κ² κ°μ΅λλ€(λ΄ aws-cliκ° μμ΄ μλνκΈ° λλ¬Έμ ν μ€νΈλμ§ μμ).