OS X: Git с отказами клиентских сертификатов

Мы обращаемся к нашему серверу Git с сертификатами клиентов, добавив следующие строки в ~/.gitconfig

[http]
        sslCAInfo = /path/to/git-ca.crt
        sslCert = /path/to/git-client.crt
        sslKey = /path/to/git-client.pem

Это отлично работает в Linux, Windows и OS X <= 10.8 с точно такими же файлами. Когда я пытаюсь это сделать на OS X 10.10, я получаю следующую ошибку:

bash-3.2$ git fetch
fatal: unable to access 'https://ourserver:12345/repository.git/': SSL: Can't load the certificate "/path/to/git-client.crt" and its private key: OSStatus -25299

Проблема происходит с git version 1.9.3 (Apple Git-50), а также с git version 2.0.1.

Обновление После удаления соответствующего элемента из KeyChain я получаю следующий сбой:

bash-3.2$ git fetch
2014-11-17 09:58:51.257 git-remote-https[2787:12194] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff9828164c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff8f91c6de objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff98125068 -[__NSPlaceholderArray initWithObjects:count:] + 360
    3   CoreFoundation                      0x00007fff98124a2d CFArrayCreate + 141
    4   libcurl.4.dylib                     0x00007fff8f75169e darwinssl_connect_common + 2089
    5   libcurl.4.dylib                     0x00007fff8f75073a Curl_ssl_connect_nonblocking + 36
    6   libcurl.4.dylib                     0x00007fff8f719673 Curl_http_connect + 77
    7   libcurl.4.dylib                     0x00007fff8f727977 Curl_protocol_connect + 129
    8   libcurl.4.dylib                     0x00007fff8f739cef multi_runsingle + 799
    9   libcurl.4.dylib                     0x00007fff8f73993d curl_multi_perform + 170
    10  git-remote-https                    0x0000000109815c8a step_active_slots + 25
    11  git-remote-https                    0x0000000109815cfb run_active_slot + 77
    12  git-remote-https                    0x0000000109817621 http_request + 459
    13  git-remote-https                    0x0000000109816148 http_request_reauth + 34
    14  git-remote-https                    0x0000000109813f76 discover_refs + 476
    15  git-remote-https                    0x00000001098131e4 main + 1556
    16  libdyld.dylib                       0x00007fff94bd25c9 start + 1
    17  ???                                 0x0000000000000003 0x0 + 3
)
libc++abi.dylib: terminating with uncaught exception of type NSException

После этого сбоя запись сертификата снова возникла в цепочке ключей. Странно то, что в OS X 10.8 ничто не будет добавлено в мою брелок, когда вы будете получать из репозитория.

Обновление 2 Когда я пытаюсь сделать то же самое на OS X 10.9, я получаю следующую ошибку:

bash-3.2$ git fetch
fatal: unable to access 'https://ourserver:12345/repository.git/': SSL certificate problem: Invalid certificate chain

Обновление 3 Я могу успешно подключиться к openssl, используя эти сертификаты, даже в OS X 10.9:

bash-3.2$ openssl s_client -connect ourserver:12345 -cert /path/to/git-client.crt -key /path/to/git-client.pem
CONNECTED(00000003)
depth=1 /C=de/O=companyca/CN=internal-ca
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
 0 s:/C=de/O=companyserv/CN=smart
   i:/C=de/O=companyca/CN=internal-ca
 1 s:/C=de/O=companyca/CN=internal-ca
   i:/C=de/O=companyca/CN=internal-ca
---
Server certificate
...
<----------------------snip---------------------->
...
---
SSL handshake has read 2348 bytes and written 1360 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: E5873AF43D24CEE6529178B4EFD7FE3368711DF1BFBC6CA89C50F8D39DE0B014
    Session-ID-ctx: 
    Master-Key: <**********>
    Key-Arg   : None
    Start Time: 1416486728
    Timeout   : 300 (sec)
    Verify return code: 19 (self signed certificate in certificate chain)
---
closed

Проблема похожа на на GitHub, но мы используем самозаверяющие сертификаты.

Ответ 1

Похоже, вы столкнулись с той же проблемой, что и в этой проблеме докеры, где они делают вывод, что это может быть ошибкой в ​​скручивании OSX.

В некотором другом сообщении они предполагают, что это может быть вызвано серийным номером сертификата либо 1, либо слишком большим, чтобы соответствовать 32 биты.

В вашем случае с OS X 10.9 я считаю, что "Недействительный сертификат" должен быть разрешен путем добавления сертификата в системную цепочку ключей как надежного (обсуждаемого в этом вопросе).

В этом сообщении описаны некоторые изменения в curl OS X, которые, как представляется, связаны между собой. По моему мнению, это может быть решение переключиться на другую curl-реализацию (но, вероятно, это может сработать, если git также будет установлен с использованием brew).

Ответ 2

Как уже упоминал Михал, это ошибка сглаживания OSX. Возможным решением будет установить версию git, которая не будет полагаться на реализацию cc osx curl