ssl sertifikasını bir web sitesinden nasıl indirebilirim?


Yanıtlar:


246

Sertifikayı indirmek için openssl içine yerleştirilmiş istemciyi şu şekilde kullanmanız gerekir:

echo -n | openssl s_client -connect HOST:PORTNUMBER \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert

Bu sertifikaya kaydedecek /tmp/$SERVERNAME.cert.

-showcertsZincirdeki tüm sertifikaları indirmek istiyorsanız kullanabilirsiniz . Ancak sadece sunucu sertifikasını indirmek istiyorsanız, belirtmeye gerek yoktur-showcerts

echo -n sunucuya bir yanıt verir, böylece bağlantı serbest bırakılır

sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'Sertifika zinciri ve bağlantı detayları hakkındaki bilgileri siler. Sertifikayı diğer anahtar depolara aktarmak için tercih edilen biçim budur.


9
Sadece iyi bir cevap vermedin, aynı zamanda kesin bir açıklama yaptığın için teşekkür ederim.
marco.m

Does -showcertsçok sunucu / yaprak sertifika göstermek? Sadece bu anahtar dahil edildiğinde ara ürün gösterdiğini sanıyordum.
Mike B,

Cevabın dediği gibi, s_clienther zaman sunucu sertifikasını gösterir (varsa, yani sunucu merhaba cevap verir ve anonim bir paket seçmez). -showcertsgösterir tüm sertifikalarını ilk önce ara maddeler ve / veya kök sertifika, sunucu aldı.
dave_thompson_085

4
Bu olsa da, bir vekil varlığında işe yaramaz.
Frederick Nord

2
Bu aynı zamanda SNI kullanan sunucularla çalışmaz (tek bir IP adresinde birden fazla sertifika / alan adı). Sorunları önlemek için openssl'nin servername parametresini belirtin: openssl s_client -connect HOST: PORTNUMBER - sunucuadı CN
saat

60

Cevabı buldum. Openssl bunu sağlar.

openssl s_client -connect $ {REMHOST}: $ {REMPORT}


2
Ayrıca openssl x509 -text <<EOF cert-text EOFsertifikanın detaylarını görmek için
mpapis

2
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pemserverfault.com/questions/139728/…
pulkitsinghal,

bu aynı şeyi başarır ve sedkesmeyi atlar .
phs

Bu sadece bir sertifikayı kontrol eder; hizmetin, her biri farklı bir kök CA tarafından imzalanmış farklı bir sertifikaya sahip, yük dengeli bir sunucu grubunun parçasıysa ne olur? Başka bir deyişle, bir mitm saldırısı bu isteğin gerçek siteye girmesine ve ardından diğer istekleri sunucularına yönlendirmesine izin verebilir. Bunu kontrol etmenin bir yolu var mı? Ve bir etki alanının gerçekten sahip olduğu tüm sertifikaların bir listesini almak için?
Jens Timmerman

@JensTimmerman "Başka bir deyişle, bir mitm saldırısı bu isteğin gerçek siteye girmesine ve ardından diğer istekleri sunucularına yönlendirmesine izin verebilir." Ortadaki adam hedef sunucu için geçerli bir sertifikaya sahip olmadıkça bu mümkün değildir (veya istemci aptalca sunucu sertifikasını kontrol etmez). Açıkçası, eğer sunucu bazen farklı bir sertifika sunarsa, muhtemelen bağlantı girişimlerini tekrarlayarak hepsini elde etmeyi umabilirsiniz.
David Tonhofer

22

GnuTLS istemci aracı, gnutls-cliaynı zamanda bu kolay yapabilirsiniz:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

Program, siteye etkileşimli bir istemci sağlamak üzere tasarlanmıştır, bu nedenle /dev/nulletkileşimli oturumu sonlandırmak için boş bir giriş yapmanız gerekir (bu örnekte ).


1
bağırsakların (sistem genelinde yapılandırılmış) https proxy ile bağlantı kurmasını ve çıkacağı sertifikayı yazdırmasını nasıl sağlar?
Frederick Nord

9

@bignose cevabına dayanarak, burada bir şef tarifi uygun bir bağımsız sürüm:

sudo apt-get install gnutls-bin 
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates

6
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

openssl'ın bu modu stdin'i bekler, bu yüzden bunu sağlıyoruz true |, bu, -connect parametresinde belirtilen sunucuya bağlanır. 2>/dev/nullhataları susturur (isteğe bağlı), tüm çıktıyı x509 ayrıştırıcısına aktarabiliriz, /dev/stdinböylece kabuk borusunu girdi dosyası olarak kullanacağız. Ve bu irade çıkışı sadece -----BEGIN CERTIFICATE-----kadar -----END CERTIFICATE-----kısmı s_clientçıkışı. > google.com.pemKomutun sonuna ekleyerek bunu bir dosyaya yönlendirebilirsiniz .


En iyi söyleyebileceğim gibi, bu sertifika zincirini doğrulamaz, yalnızca son sunucunun sağladığı hangi ssl kimliğini söyleyebilir.


2
(1) bu, 6 yıl öncesinden gelen yanıtları gerçekten iyileştirmiyor (2) x509varsayılan olarak stdin okuyor -in /dev/stdin, bu nedenle gereksiz (3) s_client, sunucu sertifikalarının yerel güven bağına (kök) doğru şekilde zincirlendiğini doğruladı; bunu gösterecek bilgiyi bastırdı (4) iptal etmediğini kontrol etmiyor (5) sunucu sertifikasındaki ismi sadece 1.0.2'de kontrol ediyor ve ardından varsayılan olarak kontrol etmiyor (fakat sertifikaya bakarak kolayca kendiniz kontrol edebilirsiniz) daha sonra)
dave_thompson_085 11:16

@ dave_thompson_085, soru nasıl sertifika indirilir ancak zincir bilgisini göstermiyor. Openssl x509'u başka bir cevapta olmaktan çok daha iyi seviyorum.
Der_Meister

0

Ex kullanarak ve işlem değiştirme alternatif sözdizimi:

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