Ich möchte die CA-Zertifikatsnamensliste von geladener SSL_CTX() abrufen Gibt es APIs, die von openSSL zur Verfügung gestellt werden, um Namen zurückzubekommen?Wie kann ich die Namensliste der CA-Subjekte kennen, die im SSL-Kontext geladen wurde?
Antwort
Ich möchte die CA-Zertifikatsnamensliste von geladenem SSL_CTX() abrufen Gibt es APIs, die von openSSL zur Verfügung gestellt werden, um den Namen zurückzuerhalten?
Art von. Ein Zertifikat hat einen Aussteller und einen Betreff. Wenn Sie den "CA Name" sagen, fragen Sie nach dem Emittenten. Und es ist normalerweise auf der SSL*
; und nicht die CTX*
.
Sie würden etwas wie das folgende durchführen. Sie müssen herausfinden, wie Sie das Zertifikat erhalten, das Sie drucken möchten. Im Folgenden sehen Sie, wie Sie es mit dem Zertifikat des Peers machen.
/* Drops out of a handshake */
SSL* ssl = ...;
/* Get the certificate from the session object */
X509* cert = SSL_get_peer_certificate(ssl);
/* Get the issuer name */
X509_NAME* iname = cert ? X509_get_issuer_name(cert) : NULL;
/* Get the subject name */
X509_NAME* sname = cert ? X509_get_subject_name(cert) : NULL;
if (iname)
print_cn_name("Issuer name", iname);
if (sname)
print_cn_name("Subject name", sname);
X509_free(cert);
Und dann:
/* This prints the Common Name (CN), which is the "friendly" */
/* name displayed to users in many tools */
void print_cn_name(const char* label, X509_NAME* const name)
{
int idx = -1, success = 0;
unsigned char *utf8 = NULL;
do
{
if(!name) break; /* failed */
idx = X509_NAME_get_index_by_NID(name, NID_commonName, -1);
if(!(idx > -1)) break; /* failed */
X509_NAME_ENTRY* entry = X509_NAME_get_entry(name, idx);
if(!entry) break; /* failed */
ASN1_STRING* data = X509_NAME_ENTRY_get_data(entry);
if(!data) break; /* failed */
int length = ASN1_STRING_to_UTF8(&utf8, data);
if(!utf8 || !(length > 0)) break; /* failed */
fprintf(stdout, "%s: %s\n", label, utf8);
success = 1;
} while (0);
if(utf8)
OPENSSL_free(utf8);
if(!success)
fprintf(stdout, " %s: <not available>\n", label);
}
IF wollten Sie Betreff Alternative Namen (SAN) für ein Server-Zertifikat, dann könnten Sie so etwas wie:
void print_san_name(const char* label, X509* const cert)
{
int success = 0;
GENERAL_NAMES* names = NULL;
unsigned char* utf8 = NULL;
do
{
if(!cert) break; /* failed */
names = X509_get_ext_d2i(cert, NID_subject_alt_name, 0, 0);
if(!names) break;
int i = 0, count = sk_GENERAL_NAME_num(names);
if(!count) break; /* failed */
for(i = 0; i < count; ++i)
{
GENERAL_NAME* entry = sk_GENERAL_NAME_value(names, i);
if(!entry) continue;
if(GEN_DNS == entry->type)
{
int len1 = 0, len2 = -1;
len1 = ASN1_STRING_to_UTF8(&utf8, entry->d.dNSName);
if(utf8) {
len2 = (int)strlen((const char*)utf8);
}
if(len1 != len2) {
fprintf(stderr, " Strlen and ASN1_STRING size do not match (embedded null?): %d vs %d\n", len2, len1);
}
/* If there's a problem with string lengths, then */
/* we skip the candidate and move on to the next. */
/* Another policy would be to fails since it probably */
/* indicates the client is under attack. */
if(utf8 && len1 && len2 && (len1 == len2)) {
fprintf(stdout, " %s: %s\n", label, utf8);
success = 1;
}
if(utf8) {
OPENSSL_free(utf8), utf8 = NULL;
}
}
else
{
fprintf(stderr, " Unknown GENERAL_NAME type: %d\n", entry->type);
}
}
} while (0);
if(names)
GENERAL_NAMES_free(names);
if(utf8)
OPENSSL_free(utf8);
if(!success)
fprintf(stdout, " %s: <not available>\n", label);
}
Das obige wurde von OpenSSL TLS client Beispiel in ihrem Wiki übernommen. Außerdem wird gezeigt, wie Sie die Kette im Bestätigungsrückruf drucken.
- 1. Wie benutze ich die Namensliste in pgdbg?
- 2. Wie kann ich die nächste Zufallszahl kennen?
- 3. Wie kann ich die Größe der Benutzerkontrolle kennen?
- 4. Kann ich die Revisionsnummer eines Commits kennen?
- 5. Wie kann ich Jobs ausführen, nachdem der Anwendungskontext geladen wurde?
- 6. Wie kann ich die Klasse kennen lernen, die als Paraher an die erweiterte abstrakte Klasse übergeben wurde?
- 7. Wie kann ich die aktivierten Funktionen einer Matplotlib-Installation kennen?
- 8. Wie kann ich die Zeitzone meiner Website kennen Host
- 9. Wie kann ich die Tastatursprache kennen? (en/fr)
- 10. Wie kann ich die Online-Benutzer meiner Website kennen?
- 11. Wie kann ich die Version von pip selbst kennen?
- 12. Wie kann ich die IP-Adressen unter einem Router kennen
- 13. Wie kann ich feststellen, ob eine CSS-Datei geladen wurde, die ich über JavaScript eingebunden habe?
- 14. Wie kann ich die Speichernutzung in C++ kennen?
- 15. Wie kann ich die installierte Version von pylab kennen?
- 16. Wie kann ich die Anzahl der Empfänger kennen? Öffnen Sie die E-Mail über google analytic?
- 17. Wie wird die Systemeigenschaftsdatei im Frühling geladen?
- 18. Wie kann ich überprüfen, ob ein untergeordnetes Browserfenster geladen wurde?
- 19. Wie kann ich die Instanz-ID im Bereich "Idee in Haltepunkten" kennen?
- 20. Wie kann ich die Android-Geräte-ID im Entwicklungsprozess von Android Studio kennen?
- 21. kann ich die Thread runnable Klassenattribute in Java kennen?
- 22. Objective-c: Wie kann das Objekt p die Änderungen der Person-Klasse kennen, nachdem die Personenklasse geändert wurde?
- 23. Wie kann ich die xdebug Version, die ich installiert habe, kennen?
- 24. Wie kann ich eine Dateiquellenzuordnung angeben, nachdem die Seite geladen wurde?
- 25. Wie kann ich feststellen, wenn meine html-Seite geladen wurde
- 26. Wie bekomme ich die Mausklickposition auf eine OBJ-Datei, die von OBJLoader geladen wurde?
- 27. C# -Methode, die ausgeführt wird, nachdem die Assembly geladen wurde
- 28. Wie kann ich meinen Fortschrittsdialog ablehnen, nachdem Webview geladen wurde?
- 29. Wie überprüft man, ob die Standardkonfiguration in CI3 geladen wurde?
- 30. Javascript. Wie kann ich diese Funktion (einfacher Timer) aufrufen, nachdem die Seite geladen wurde?
vor allem dank @jww. Ich habe zwei Sitzungen. In der ersten Sitzung habe ich ein CA-Zertifikat mit crl in den SSL-Kontext geladen. Wieder habe ich eine neue Sitzung erstellt, aber ich habe den SSL-Kontext von der ersten Sitzung geerbt, bedeutet eine Einzelton-Klasse wie diese. gibt es zwei Situationen. 1. Wenn CA-Zertifikat der ersten Sitzung und CA-Zertifikat der zweiten Sitzung nicht identisch sind 2. Wenn CA-Zertifikat der ersten Sitzung und Zertifikat der zweiten Sitzung CA nicht übereinstimmen dafür muss ich den aktuellen CA-Zertifikatsantrag prüfen, der in SSL geladen wurde Kontext während der ersten Sitzung. Dann werde ich mit dem Namen des CA-Zertifikats der Session 2 vergleichen. –