Sertifikayı sunucudan almak için openssl kullanma


354

Anahtar sunucuma eklemek ve java uygulamamda kullanmak için kullanabileceğim uzak bir sunucunun sertifikasını almaya çalışıyorum.

Üst düzey bir dev (kim tatillerde :() bana bunu çalıştırabilir:

openssl s_client -connect host.host:9999

Ham sertifikayı almak için kopyalayıp dışa aktarabilirim. Aşağıdaki çıktıyı alıyorum:

depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA
verify error:num=19:self signed certificate in certificate chain
verify return:0
23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

Bu seçenekle de denedim

-showcerts 

ve bu (debian aklı başında)

-CApath /etc/ssl/certs/ 

Ancak aynı hatayı alın.

Bu kaynak , CApath bayrağını kullanabileceğimi söylüyor, ancak yardımcı olmuyor gibi görünüyor. Boşuna birden çok yol denedim.

Lütfen nerede yanlış yaptığımı bana bildirin.

Yanıtlar:


464

SNI ile

Uzak sunucu SNI kullanıyorsa (yani, tek bir IP adresinde birden fazla SSL ana bilgisayarını paylaşıyorsa), doğru sertifikayı almak için doğru ana bilgisayar adını göndermeniz gerekir.

openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null

SNI olmadan

Uzak sunucu SNI kullanmıyorsa, -servernameparametreyi atlayabilirsiniz :

openssl s_client -showcerts -connect www.example.com:443 </dev/null


Bir sitenin sertifikasının tüm ayrıntılarını görüntülemek için bu komutlar zincirini de kullanabilirsiniz:

$ echo | \
    openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \
    openssl x509 -text

3
Hmm. Bu komutu denerken hala aynı hatayı alıyorum. Openssl versiyonumun 'OpenSSL 0.9.8g 19 Ekim 2007' olduğunu fark ettim. Hiç fikrin var mı?
kötü mantı

39
Yararlı: echo "" | openssl s_client -connect server:port -prexit 2>/dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p' stackoverflow.com/a/12918442/843000
mbrownnyc

16
Madboa.com dan Alternatif yararlı komut dosyası :echo | openssl s_client -connect server:port 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cert.pem
rmeakins

9
Bunu biraz daha özlü hale getirmek için, sedile değiştirebilir openssl x509ve bir alt kabuk kullanarak okuyabilirsiniz:openssl x509 -in <(openssl s_client -connect server:port -prexit 2>/dev/null)
Gabe Martin-Dempesy

27
Ayrıcaecho | openssl s_client -connect google.com:443 2>/dev/null | openssl x509
MattSizzle

68

Ari'nin cevabına katılıyorum (ve yükseltildi :), Windows'ta Java ile çalışmak için ekstra bir adım atmam gerekiyordu (dağıtılması gerekiyordu):

openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der

openssl x509 -outform DERDönüşümü eklemeden önce , Windows'daki keytool'dan sertifikanın biçimi hakkında şikayet eden bir hata alıyordum. .Der dosyasını içe aktarmak iyi çalıştı.


Garip. Java 6'dan beri Windows'ta keytool ile PEM sertifikaları kullanıyorum ve hiçbir zaman bir sorunla karşılaşmadım.
imgx64

39

Burada daha fazla karmaşıklık olduğu ortaya çıktı: Bu haddeleme için daha fazla ayrıntı sağlamam gerekiyordu. Ben onun istemci kimlik doğrulaması gerektiren bir bağlantı ve hankshake sertifikaları dökümü sahneye devam etmek için daha fazla bilgi gerekiyordu gerçeği ile ilgili bir şey düşünüyorum.

İşte benim çalışma komutu:

openssl s_client -connect host:port -key our_private_key.pem -showcerts \
                 -cert our_server-signed_cert.pem

Umarım bu daha fazla bilgi ile yapabilen herkes için doğru yönde bir dürtmedir.


6
Üzgünüm, ama cevabınız pek mantıklı değil. Sertifikayı alabilmek için sertifikayı sunucuya geçirmeniz mi gerekiyor?
Ari Maniatis

2
Evet. İstemci kimlik doğrulaması AFAIK.
kötü macun

11
Görünüşe göre '-prexit' bu verileri de döndürecek. Örneğin; openssl s_client -connect ev sahibi: port -prexit
Robert

39

Bu sefer aşağıdakileri kullanarak sertifikayı PEM biçimindeki uzak bir sunucudan ayıklamak için tek astar sed:

openssl s_client -connect www.google.com:443 2>/dev/null </dev/null |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

2
Bu, sertifikayı çıkarmak için neredeyse mükemmel, sadece -servernameseçeneği kaçırıyor, nedenini bilmiyorum, ancak tam sertifikayı almak için kullanmak zorunda kaldım.
Karl.S29

-servername sunucu adı göstergesi (SNI) için gereklidir. Web araması geri kalanında genişleyebilir.
Sam Gleske

32

Bunun için anahtar deposuna eklemek için PEM çıktısının yanı sıra insan tarafından okunabilir bir çıktı içeren ve aynı zamanda bir HTTP sunucusuyla çalışıyorsanız önemli olan SNI'yi destekleyen en kolay komut satırı:

openssl s_client -servername example.com -connect example.com:443 \
    </dev/null 2>/dev/null | openssl x509 -text

-Servername seçenek SNI destek ve sağlamaktır openssl x509 -metin insan okunabilir bir biçimde baskılar sertifikasını.


-Servername'inize alt etki alanınızı ekleyebilirsiniz, örneğin example.com yerine ws.example.com (bunu -connect parametresine de uygulayın).
17'de russellhoff

24

Uzak sunucunun sertifikasını almak için opensslaracı kullanabilirsiniz ve onu arasında BEGIN CERTIFICATEve END CERTIFICATEkopyalayıp kopyalamanız gereken sertifika dosyanız (CRT) arasında bulabilirsiniz.

İşte bunu gösteren komut:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt

Tüm sertifikaları zincirden döndürmek için aşağıdaki ggibi (global) eklemeniz yeterlidir:

ex +'g/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq

Ardından sertifika dosyanızı ( file.crt) anahtar zincirinize içe aktarabilir ve güvenilir hale getirebilirsiniz, böylece Java şikayet etmemelidir.

OS X'te dosyayı çift tıklayabilir veya Keychain Access'inize sürükleyip bırakabilirsiniz, böylece oturum açma / Sertifikalar'da görünecektir. Ardından içe aktarılan sertifikayı çift tıklayın ve SSL için Her Zaman Güven olmasını sağlayın .

CentOS 5'te bunları /etc/pki/tls/certs/ca-bundle.crtdosyaya ekleyebilir (ve çalıştır sudo update-ca-trust force-enable:) veya CentOS 6'da kopyalayıp /etc/pki/ca-trust/source/anchors/çalıştırabilirsiniz sudo update-ca-trust extract.

Ubuntu'da, bunları kopyalayıp /usr/local/share/ca-certificatesçalıştırın sudo update-ca-certificates.


12
HOST=gmail-pop.l.google.com
PORT=995

openssl s_client -servername $HOST -connect $HOST:$PORT < /dev/null 2>/dev/null | openssl x509 -outform pem

6

sunucunun sertifikasını değil, yalnızca sertifika zincirini yazdırmak için:

# MYHOST=myhost.com
# MYPORT=443
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}'

CentOS / RHEL 6/7'de CA güvenini güncellemek için:

# update-ca-trust enable
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >/etc/pki/ca-trust/source/anchors/myca.cert
# update-ca-trust extract

CentOS / RHEL 5 üzerinde:

# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >>/etc/pki/tls/certs/ca-bundle.crt

Tam olarak CentOS7'de ihtiyacım olan şey. Teşekkürler!
Arthur Hebert

5

Bir sonraki bash betiğini kullanarak sunucu kök sertifikasını alıp saklayabilirsiniz:

CERTS=$(echo -n | openssl s_client -connect $HOST_NAME:$PORT -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p')
echo "$CERTS" | awk -v RS="-----BEGIN CERTIFICATE-----" 'NR > 1 { printf RS $0 > "'$SERVER_ROOT_CERTIFICATE'"; close("'$SERVER_ROOT_CERTIFICATE'") }'

Sadece gerekli değişkenlerin üzerine yazın.


4

Sunucunuz bir e-posta sunucusuysa (MS Exchange veya Zimbra) starttlsve smtpbayraklarını eklemeniz gerekebilir :

openssl s_client -starttls smtp -connect HOST_EMAIL:SECURE_PORT 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > CERTIFICATE_NAME.pem

Nerede,

  • HOST_EMAIL , sunucu alan adıdır; örneğin, mail-server.com.

  • SECURE_PORT iletişim bağlantı noktasıdır, örneğin 587 veya 465

  • CERTIFICATE_NAME çıktısının dosya adı (BASE 64 / PEM Biçimi)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.