Jenkins + LDAPS + самоподписные сертификаты

Проблема

При попытке сконфигурировать Jenkins для подключения к LDAP серверу с использованием шифрования данных получаем ошибку:

Unable to connect to ldaps://ldap.example.com:636 : javax.naming.CommunicationException: anonymous bind failed: ldap.example.com:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]

javax.naming.CommunicationException: anonymous bind failed: ldap.example.com:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]
    at com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:198)
    at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2788)
    at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:319)
    at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:192)
    at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:210)
    at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:153)
    at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:83)

Она говорит нам, что Java не осилила TLS (SSL) из-за того, что у нас самоподписной сертификат.

Лечение

Заходим на сервер с Jenkins (если у вас он в доккере, то делайте все, что описано ниже внутри доккер контейнера). Скачиваем InstallCert.java:

$ wget https://raw.githubusercontent.com/escline/InstallCert/master/InstallCert.java

Устанавливаем java компилятор:

$ sudo apt install openjdk-8-jdk-headless

Если вы используете 9-ю версию, то установите ее.

Собираем:

javac InstallCert.java

Добавляем сертификат в хранилище:

java InstallCert ldap.example.com:636

Вывод консоли будет содержать нечто похожее на:

jenkins@ci:~$ java InstallCert ldap.example.com:636
Loading KeyStore /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/jssecacerts...
Opening connection to ldap.example.com:636...
Starting SSL handshake...

No errors, certificate is already trusted

Server sent 1 certificate(s):

 1 Subject EMAILADDRESS=helpdesk@example.com, CN=ldap.example.com, OU=Company, O=Company Inc., L=City, ST=State, C=RU
   Issuer  EMAILADDRESS=helpdesk@example.com, CN=ldap.example.com, OU=Company, O=Company Inc., L=City, ST=State, C=RU
   sha1    16 24 4e 25 af a4 0f 81 8a 63 2e da be 6f d3 0f 6e 0b 1b 0f
   md5     44 8f ed d6 f8 34 c9 13 ef 8d 66 e2 03 f6 2b a9

Enter certificate to add to trusted keystore or 'q' to quit: [1]
1

[
[
  Version: V1
  Subject: EMAILADDRESS=helpdesk@example.com, CN=ldap.example.com, OU=Company, O=Company Inc., L=City, ST=State, C=RU
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  Sun RSA public key, 2048 bits
  modulus: 27876913140592764992645624990000862317594924425...
  public exponent: 65537
  Validity: [From: Thu Dec 13 14:50:14 UTC 2012,
               To: Sun Dec 11 14:50:14 UTC 2022]
  Issuer: EMAILADDRESS=helpdesk@example.com, CN=ldap.example.com, OU=Company, O=Company Inc., L=City, ST=State, C=RU
  SerialNumber: [    ad5df5fa 3eefe865]

]
  Algorithm: [SHA1withRSA]
  Signature:
0000: 77 48 DE 49 5C 83 45 FE   F9 68 F2 98 97 DF 20 51  wH.I\.E..h.... Q
0010: 5E 23 87 28 83 A8 27 71   EF AA 93 79 A3 91 6A 1A  ^#.(..'q...y..j.
0020: B3 8B AB 0D CE 90 A8 3F   EF AC 2C A1 15 CA 7B 7C  .......?..,.....
0030: B8 77 C8 A0 6A DA E1 B9   18 D7 92 E7 7E 6D 39 9C  .w..j........m9.
0040: 72 51 B6 24 66 2C 26 EC   B8 61 D7 FF 6F F5 E8 36  rQ.$f,&..a..o..6
0050: C9 E0 1B 4E 40 77 3D EB   1A 86 7E C2 44 2F 3B 5F  ...N@w=.....D/;_
0060: CA 49 F1 7C C3 58 68 AE   43 CA AD 0E 19 61 7D 90  .I...Xh.C....a..
0070: 35 17 07 80 2A 33 D2 B3   1B 4F FD 15 44 A2 02 F6  5...*3...O..D...
0080: 66 E1 C4 2E 35 30 9B 7E   EE 39 A6 D9 81 ED C4 C7  f...50...9......
0090: B1 90 24 13 94 20 F6 F5   1B 87 8D 72 0A B5 99 7B  ..$.. .....r....
00A0: 2F D3 64 21 12 EC BF C6   01 B1 99 98 15 04 62 2F  /.d!..........b/
00B0: AC DC 9F AD 95 92 2B 4C   07 E6 08 20 3A 8E 7B FD  ......+L... :...
00C0: E1 37 5B C0 53 60 5F 3C   6B D8 EB A8 82 CB F8 BA  .7[.S`_<k.......
00D0: 2F 0B C1 05 94 A5 87 29   BA E1 78 EF 35 72 9B 4D  /......)..x.5r.M
00E0: 36 5B 0E C5 8A B1 6C 98   DC 50 D2 33 65 54 E1 42  6[....l..P.3eT.B
00F0: 18 28 7A A1 59 EB E8 98   D9 5E 96 5E 8D 85 7F 68  .(z.Y....^.^...h

]

Added certificate to keystore 'jssecacerts' using alias 'ldap.example.com-1'

jenkins@ci:~$

Добавляем хранилище в Java:

$ sudo cp jssecacerts /usr/lib/jvm/default-java/jre/lib/security/

Перезапускаем Jenkins и настраиваем подключение к LDAP.


Comments !