References #2
parent
9a8b208c62
commit
f5e983f5b9
9 changed files with 429 additions and 0 deletions
@ -0,0 +1,16 @@ |
||||
# ##################################################################### |
||||
# Automatically generated by qmake (2.01a) Fr 18. Jun 11:12:34 2010 |
||||
# ##################################################################### |
||||
TEMPLATE = app |
||||
TARGET = |
||||
DEPENDPATH += . |
||||
INCLUDEPATH += ../engine_securetoken . |
||||
|
||||
# Input |
||||
SOURCES += qtssltest.cpp \ |
||||
smartcardauth.cpp \ |
||||
pindialog.cpp |
||||
QT += webkit |
||||
QT += network |
||||
HEADERS += smartcardauth.h \ |
||||
pindialog.h |
@ -0,0 +1,37 @@ |
||||
#include <QtGui> |
||||
#include "pindialog.h" |
||||
|
||||
|
||||
PinDialog::PinDialog(QWidget *parent) |
||||
: QDialog(parent) |
||||
{ |
||||
label=new QLabel(tr("Enter &PIN:")); |
||||
lineEdit=new QLineEdit; |
||||
lineEdit->setEchoMode(QLineEdit::Password); |
||||
label->setBuddy(lineEdit); |
||||
|
||||
okButton=new QPushButton(tr("&OK")); |
||||
okButton->setDefault(true); |
||||
|
||||
cancelButton=new QPushButton(tr("&Cancel")); |
||||
|
||||
connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); |
||||
connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); |
||||
|
||||
QHBoxLayout* tl= new QHBoxLayout; |
||||
tl->addWidget(label); |
||||
tl->addWidget(lineEdit); |
||||
QHBoxLayout* bl= new QHBoxLayout; |
||||
bl->addStretch(); |
||||
bl->addWidget(okButton); |
||||
bl->addWidget(cancelButton); |
||||
QVBoxLayout* ml= new QVBoxLayout; |
||||
ml->addLayout(tl); |
||||
ml->addLayout(bl); |
||||
setLayout(ml); |
||||
} |
||||
|
||||
QString PinDialog::pin() const { |
||||
// TODO: Cleanup of internal strings as soon as the PIN is retrieved
|
||||
return lineEdit ? lineEdit->text() : ""; |
||||
} |
@ -0,0 +1,22 @@ |
||||
#ifndef PINDIALOG_H |
||||
#define PINDIALOG_H |
||||
|
||||
#include <QDialog> |
||||
class QLabel; |
||||
class QLineEdit; |
||||
class QPushButton; |
||||
|
||||
class PinDialog : public QDialog |
||||
{ |
||||
Q_OBJECT |
||||
public: |
||||
PinDialog(QWidget *parent = 0); |
||||
QString pin() const; |
||||
private: |
||||
QLabel* label; |
||||
QLineEdit* lineEdit; |
||||
QPushButton* okButton; |
||||
QPushButton* cancelButton; |
||||
}; |
||||
|
||||
#endif // PINDIALOG_H
|
@ -0,0 +1,48 @@ |
||||
#include <QApplication> |
||||
#include <QtNetwork> |
||||
#include <QtWebKit> |
||||
#include <QList> |
||||
#include <QFile> |
||||
#include <iostream> |
||||
#include "smartcardauth.h" |
||||
|
||||
SmartCardAuth g_scard_auth; |
||||
|
||||
int main(int argc, char *argv[]) |
||||
{ |
||||
|
||||
SmartCardAuth::initialize(); |
||||
|
||||
QApplication app(argc, argv); |
||||
|
||||
QSslConfiguration sslConf(QSslConfiguration::defaultConfiguration()); |
||||
|
||||
// Works even without specifying the root certificate, we just need to add the intermediates,
|
||||
// and that's done in SmartCardAuth.cpp
|
||||
#if 0 |
||||
QFile caCertsFile("D:\\QtSmartCardAuth_TMI\\QtSslTest\\swsign_root.pem"); |
||||
caCertsFile.open(QIODevice::ReadOnly); |
||||
QList<QSslCertificate> chain( QSslCertificate::fromDevice(&caCertsFile) ); |
||||
|
||||
sslConf.setCaCertificates(chain); |
||||
#endif |
||||
|
||||
sslConf.setPeerVerifyMode(QSslSocket::QueryPeer); |
||||
sslConf.setOpenSslHook(&g_scard_auth); |
||||
QSslConfiguration::setDefaultConfiguration(sslConf); |
||||
|
||||
// TODO - IMPORTANT: Error reporting!
|
||||
// If there is ANY failure (no network, no host resolution, no SSL connection, timeout) we just see a
|
||||
// blank page!
|
||||
QWebView web; |
||||
|
||||
// Works - NEEDS AN INTERMEDIATE CERTIFICATE, either loaded from card or from file, see SmartCardAuth
|
||||
web.load(QUrl("https://dev.swisssign.com/test/")); |
||||
|
||||
// web.load(QUrl("https://e2k7.demo8.cryptovision.com/ssl/"));
|
||||
web.show(); |
||||
|
||||
int rv=app.exec(); |
||||
SmartCardAuth::deinitialize(); |
||||
return rv; |
||||
} |
@ -0,0 +1,162 @@ |
||||
#include "smartcardauth.h" |
||||
#include "pindialog.h" |
||||
#include <QtNetwork/private/qsslsocket_openssl_symbols_p.h> |
||||
|
||||
#include "engine_sct.h" |
||||
|
||||
#include <string> |
||||
|
||||
ENGINE* SmartCardAuth::e=NULL; |
||||
enum_certs_s* SmartCardAuth::certs_found=NULL; |
||||
QWidget* SmartCardAuth::parent=0; |
||||
bool SmartCardAuth::pin_configured=false; |
||||
bool SmartCardAuth::pin_rejected=false; |
||||
|
||||
void SmartCardAuth::initialize() { |
||||
QSslSocketPrivate::ensureInitialized(); |
||||
|
||||
q_ENGINE_load_dynamic(); |
||||
e = q_ENGINE_by_id("dynamic"); |
||||
|
||||
int r=q_ENGINE_ctrl_cmd_string(e, "SO_PATH", "C:\\Windows\\System32\\engine_act.dll", 0); |
||||
r=q_ENGINE_ctrl_cmd_string(e, "ID", "act", 0); |
||||
r=q_ENGINE_ctrl_cmd_string(e, "LIST_ADD", "1", 0); |
||||
r=q_ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0); |
||||
|
||||
if(!r) |
||||
{ |
||||
unsigned int err = 0; |
||||
while((err = q_ERR_get_error())) |
||||
{ |
||||
char *str = q_ERR_error_string(err, NULL); |
||||
fprintf(stderr,"%s\n", str); |
||||
} |
||||
} |
||||
|
||||
r=q_ENGINE_init(e); |
||||
|
||||
} |
||||
|
||||
void SmartCardAuth::deinitialize() { |
||||
q_ENGINE_finish(e); |
||||
q_ENGINE_cleanup(); |
||||
} |
||||
|
||||
void SmartCardAuth::setPinDlgParent(QWidget* p) { |
||||
parent=p; |
||||
} |
||||
|
||||
int SmartCardAuth::client_cert_cb(SSL *ssl, X509 **x509, EVP_PKEY **pkey) |
||||
{ |
||||
// NB: Keep in mind that this function is called for EVERY SSL connection to be opened.
|
||||
|
||||
for(size_t i=certs_found->num_certs;i--;) |
||||
{ |
||||
const char *id_p = certs_found->certificate[i].id; |
||||
|
||||
if(id_p == NULL) continue; |
||||
|
||||
// Name has the format "slot-x-name-SwissSign_digSig" for the certificate/key we're looking for
|
||||
std::string name(certs_found->certificate[i].name); |
||||
std::string compare("-name-SwissSign_digSig"); |
||||
|
||||
// Compare the rightmost part of the retrieved name to locate the certificate/keypair
|
||||
size_t pos = name.length() - compare.length(); |
||||
if(name.substr(pos) != compare) |
||||
continue; |
||||
|
||||
// // Filter out the correct certificate depending on well-known sorting criteria
|
||||
// // Given example searches for a keyword in the certificate's subject, but since we've got
|
||||
// // the decoded certificate as an X509* structure we can check all the fields.
|
||||
// X509_NAME* subj_name = q_X509_get_subject_name(certs_found->certificate[i].cert);
|
||||
// int maxlen = 2048;
|
||||
// char buf[maxlen+1];
|
||||
// buf[maxlen]=0;
|
||||
// q_X509_NAME_oneline(subj_name, buf, maxlen);
|
||||
// std::string subject(buf);
|
||||
|
||||
// const char *compare="CN=Carsten Pluntke";
|
||||
// if(subject.find(compare) == std::string::npos)
|
||||
// continue;
|
||||
|
||||
// Here we found a suitable certificate.
|
||||
|
||||
// Now prepare the reference to the SmartCard's private key and a copy of the certificate
|
||||
// to pass back to the caller.
|
||||
*x509 = q_X509_dup(certs_found->certificate[i].cert); |
||||
*pkey = NULL; |
||||
|
||||
// If we don't have a PIN yet, pop up a dialog, ask for a PIN and pass it along to the engine
|
||||
// for usage.
|
||||
if(!pin_configured) |
||||
{ |
||||
PinDialog dlg(parent); |
||||
int ok=dlg.exec(); |
||||
if(ok!=1) return 0; // User cancelled
|
||||
QByteArray pinByteArray=dlg.pin().toAscii(); |
||||
char *pin_str = pinByteArray.data(); |
||||
|
||||
// The engine control command takes a copy and overwrites the source array
|
||||
if(q_ENGINE_ctrl_cmd_string(e, "PIN", pin_str, 0)) |
||||
pin_configured = true; |
||||
else |
||||
return 0; // Engine refuses to take the PIN
|
||||
|
||||
*pkey = q_ENGINE_load_private_key(e, id_p, NULL, NULL); |
||||
|
||||
// We do a test authorization on loading of the private key. If the operation fails at all,
|
||||
// DON'T try again (see below) or we would instantly lock the card in a single session because
|
||||
// of the retries!
|
||||
if(!*pkey) |
||||
pin_rejected = true; |
||||
} |
||||
|
||||
// Second to nth iteration: We skipped the PIN dialog here, now load the key if we don't have the
|
||||
// explicit information not to do it (because the PIN is wrong)
|
||||
if(!*pkey && !pin_rejected) |
||||
*pkey = q_ENGINE_load_private_key(e, id_p, NULL, NULL); |
||||
|
||||
break; |
||||
} |
||||
|
||||
if(!*x509) { |
||||
qWarning("Unable to load certificate"); |
||||
return 0; |
||||
} |
||||
|
||||
if(!*pkey) { |
||||
qWarning("Unable to load key"); |
||||
return 0; |
||||
} |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
bool SmartCardAuth::hookInitSslContext(SSL_CTX *ctx) |
||||
{
|
||||
bool result = false; |
||||
|
||||
if(!certs_found) |
||||
result = (q_ENGINE_ctrl_cmd(e, "ENUM_CERTS", 0, &certs_found, NULL, 0) != 0); |
||||
else |
||||
result = true; |
||||
|
||||
#ifdef USE_CERTIFICATE_FILE |
||||
// Load a specific intermediate certificate from a file
|
||||
BIO* cert_file= q_BIO_new_file("D:\\QtSmartCardAuth_TMI\\QtSslTest\\swsign_interm.pem", "r"); |
||||
X509* interm=q_PEM_read_bio_X509(cert_file,NULL,NULL, NULL); |
||||
q_BIO_free(cert_file); |
||||
|
||||
q_SSL_CTX_add_extra_chain_cert(ctx,interm); |
||||
#else |
||||
// Add all of the card's certificates without a private key as intermediate certs
|
||||
for(size_t i=certs_found->num_certs;i--;) |
||||
{ |
||||
if(certs_found->certificate[i].id == NULL) |
||||
q_SSL_CTX_add_extra_chain_cert(ctx, q_X509_dup(certs_found->certificate[i].cert)); |
||||
} |
||||
#endif |
||||
|
||||
q_SSL_CTX_set_client_cert_cb(ctx,client_cert_cb); |
||||
return true; |
||||
} |
@ -0,0 +1,27 @@ |
||||
#ifndef SMARTCARDAUTH_H |
||||
#define SMARTCARDAUTH_H |
||||
|
||||
#include <Qt/private/qopensslhook_p.h> |
||||
class QWidget; |
||||
|
||||
struct enum_certs_s; |
||||
|
||||
class SmartCardAuth : public QOpenSslHook { |
||||
|
||||
public: |
||||
static void initialize(); |
||||
static void deinitialize(); |
||||
static void setPinDlgParent(QWidget* parent); |
||||
|
||||
virtual bool hookInitSslContext(SSL_CTX* ctx); |
||||
|
||||
private: |
||||
static int client_cert_cb(SSL *ssl, X509 **x509, EVP_PKEY **pkey); |
||||
static ENGINE* e; |
||||
static enum_certs_s* certs_found; |
||||
static QWidget* parent; |
||||
static bool pin_configured; |
||||
static bool pin_rejected; |
||||
}; |
||||
|
||||
#endif // SMARTCARDAUTH_H
|
@ -0,0 +1,39 @@ |
||||
Bag Attributes |
||||
localKeyID: 01 00 00 00 |
||||
1.3.6.1.4.1.311.17.3.20: AB FC 95 89 38 6A 06 C3 21 78 B7 AE 9E 87 06 8A C8 79 33 02 |
||||
friendlyName: My SwissSign ID |
||||
subject=/CN=Markus Tesche/emailAddress=markus.tesche@cryptovision.com |
||||
issuer=/C=CH/O=SwissSign AG/CN=SwissSign Personal Silver CA 2008 - G2 |
||||
-----BEGIN CERTIFICATE----- |
||||
MIIFzDCCBLSgAwIBAgIPCfGkMO74CroouYxQ+mKcMA0GCSqGSIb3DQEBBQUAMFUx |
||||
CzAJBgNVBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxLzAtBgNVBAMTJlN3 |
||||
aXNzU2lnbiBQZXJzb25hbCBTaWx2ZXIgQ0EgMjAwOCAtIEcyMB4XDTEwMDQxNjEw |
||||
MDI0N1oXDTExMDQxNjEwMDI0N1owRzEWMBQGA1UEAxMNTWFya3VzIFRlc2NoZTEt |
||||
MCsGCSqGSIb3DQEJARYebWFya3VzLnRlc2NoZUBjcnlwdG92aXNpb24uY29tMIIB |
||||
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu0DvJNEgXJefs4pdCnGzn6zS |
||||
8jTO20XS0Gzu16exDDXZ1aqIUdfj/dV5ya25YiJmOqwkOIvi3ruaXTYEGhGAMXUb |
||||
5/AqzjSwJ5Jn5KG2s8zD8GchJf72hUPTF4Pke0aS1tQ+0r3L5uVCDLzMZ839GF1/ |
||||
bbp1bb8vgXa7UL0qbeLH4nITT0QgEVoXhx/xGDnvOBfvmy7OQ3/GuOqnFHz6REIe |
||||
daYfEMYyxIziYa1aYlyUw1xGIkOcNahznkN6wK+enrJPzLORFcF9soZOGO3cMH7k |
||||
tKPxB1P8LeZtgoIXLmrns5aJ11omB+zCRXieZTyj6OAFPR6Z700ozZG4PWAdxwID |
||||
AQABo4ICpTCCAqEwWQYDVR0RBFIwUIEebWFya3VzLnRlc2NoZUBjcnlwdG92aXNp |
||||
b24uY29toC4GCisGAQQBgjcUAgOgIAwebWFya3VzLnRlc2NoZUBjcnlwdG92aXNp |
||||
b24uY29tMA4GA1UdDwEB/wQEAwID+DA1BgNVHSUELjAsBggrBgEFBQcDAgYIKwYB |
||||
BQUHAwQGCisGAQQBgjcKAwQGCisGAQQBgjcUAgIwHwYDVR0jBBgwFoAU6zWxVm0V |
||||
YFj04SLNHEYcrtAEAGUwgf8GA1UdHwSB9zCB9DBHoEWgQ4ZBaHR0cDovL2NybC5z |
||||
d2lzc3NpZ24ubmV0L0VCMzVCMTU2NkQxNTYwNThGNEUxMjJDRDFDNDYxQ0FFRDAw |
||||
NDAwNjUwgaiggaWggaKGgZ9sZGFwOi8vZGlyZWN0b3J5LnN3aXNzc2lnbi5uZXQv |
||||
Q049RUIzNUIxNTY2RDE1NjA1OEY0RTEyMkNEMUM0NjFDQUVEMDA0MDA2NSUyQ089 |
||||
U3dpc3NTaWduJTJDQz1DSD9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0P2Jhc2U/ |
||||
b2JqZWN0Q2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnQwZAYDVR0gBF0wWzBZBglg |
||||
hXQBWQEDAQQwTDBKBggrBgEFBQcCARY+aHR0cDovL3JlcG9zaXRvcnkuc3dpc3Nz |
||||
aWduLmNvbS9Td2lzc1NpZ24tU2lsdmVyLUNQLUNQUy1SNC5wZGYwdAYIKwYBBQUH |
||||
AQEEaDBmMGQGCCsGAQUFBzAChlhodHRwOi8vc3dpc3NzaWduLm5ldC9jZ2ktYmlu |
||||
L2F1dGhvcml0eS9kb3dubG9hZC9FQjM1QjE1NjZEMTU2MDU4RjRFMTIyQ0QxQzQ2 |
||||
MUNBRUQwMDQwMDY1MA0GCSqGSIb3DQEBBQUAA4IBAQA6L3y3A9mZ+xziOo71CcWq |
||||
WjFl8sqtk0ul6oh0uA7qDT8DP2BjP+uVUZr3fdnzWenL1qLbnh9M90yWLst0vGZ1 |
||||
dOBO5Ex+6VgHb95jcK4BztfCYGhGvdtBbWbdJELmPBF+87OL/C/PYRrLvYqDo0XX |
||||
P5R1DZeJu732qaFB30Z28Fino7RzuSmngwwWujRQGJs2sVmxjkHqD0Lrxkp9eOQl |
||||
XwLo9uhMlEgDhah/dPA+S/+zApB8mNjhILw+3WkPgEsNLob15u5wvJEZ4GD/vK7E |
||||
kbMxGDlvSkM6+tWVizxeqhFJgYA2kLeY/pKJ9ZRT2d+k+DJufdWeWMCbWPVEiILc |
||||
-----END CERTIFICATE----- |
@ -0,0 +1,41 @@ |
||||
Bag Attributes |
||||
1.3.6.1.4.1.311.17.3.20: EB 35 B1 56 6D 15 60 58 F4 E1 22 CD 1C 46 1C AE D0 04 00 65 |
||||
subject=/C=CH/O=SwissSign AG/CN=SwissSign Personal Silver CA 2008 - G2 |
||||
issuer=/C=CH/O=SwissSign AG/CN=SwissSign Silver CA - G2 |
||||
-----BEGIN CERTIFICATE----- |
||||
MIIGZzCCBE+gAwIBAgIJAOJWt1OXa3ZYMA0GCSqGSIb3DQEBBQUAMEcxCzAJBgNV |
||||
BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxITAfBgNVBAMTGFN3aXNzU2ln |
||||
biBTaWx2ZXIgQ0EgLSBHMjAeFw0wODA3MDkxMTExMDlaFw0yMzA3MDkxMTExMDla |
||||
MFUxCzAJBgNVBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxLzAtBgNVBAMT |
||||
JlN3aXNzU2lnbiBQZXJzb25hbCBTaWx2ZXIgQ0EgMjAwOCAtIEcyMIIBIjANBgkq |
||||
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9/NTXkltjAPlJxchGGCldpQ/FRC4IUDP |
||||
NjOsKnKaj2HDa956SQhYPYDYO/CdHUEQAb9rB1YajbM9v2O6MX7ickYYaIfXhU+g |
||||
yXsTqdA50YnWNWdodsFflgnNzzoF0T8GBQraFvJD8qQHHaKsgHUBnaDo9zSnv7bm |
||||
OWhmUkc5KU20negqrRVhtKIx4BCR2x7kQ/Er3hDBNMtshO5iFCdE2DHx3zwhzMCs |
||||
kGjTdGjJF0qOOwmnsQVljQekkK4uet56RG+wAv50/xqH9VjppiXxzIgiJ9jLMcEv |
||||
KAxxch73+whObnoFrCF/PwpaZvi/5RYU+RubxJ+6Mw2GlxVdrqEGjwIDAQABo4IC |
||||
RjCCAkIwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0O |
||||
BBYEFOs1sVZtFWBY9OEizRxGHK7QBABlMB8GA1UdIwQYMBaAFBegzcHkQbY6WzvL |
||||
RZ29HMKY+oZYMIH/BgNVHR8EgfcwgfQwR6BFoEOGQWh0dHA6Ly9jcmwuc3dpc3Nz |
||||
aWduLm5ldC8xN0EwQ0RDMUU0NDFCNjNBNUIzQkNCNDU5REJEMUNDMjk4RkE4NjU4 |
||||
MIGooIGloIGihoGfbGRhcDovL2RpcmVjdG9yeS5zd2lzc3NpZ24ubmV0L0NOPTE3 |
||||
QTBDREMxRTQ0MUI2M0E1QjNCQ0I0NTlEQkQxQ0MyOThGQTg2NTglMkNPPVN3aXNz |
||||
U2lnbiUyQ0M9Q0g/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP29iamVj |
||||
dENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50MGQGA1UdIARdMFswWQYJYIV0AVkB |
||||
AwEDMEwwSgYIKwYBBQUHAgEWPmh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5j |
||||
b20vU3dpc3NTaWduLVNpbHZlci1DUC1DUFMtUjMucGRmMHQGCCsGAQUFBwEBBGgw |
||||
ZjBkBggrBgEFBQcwAoZYaHR0cDovL3N3aXNzc2lnbi5uZXQvY2dpLWJpbi9hdXRo |
||||
b3JpdHkvZG93bmxvYWQvMTdBMENEQzFFNDQxQjYzQTVCM0JDQjQ1OURCRDFDQzI5 |
||||
OEZBODY1ODANBgkqhkiG9w0BAQUFAAOCAgEALip22pfzTN9kJ+FbLZXvuVUu27gJ |
||||
ZTFAsEu9fJCx2dhxGFPO6DUsmxS6H3SC1FeSwFeTm1AFJXvgldRduER46TOQQf7h |
||||
v0abeX1yvDhQGcBoWgay0xveXWfPaZL49awJhdTdWi5qOSPv9O9zWjYew+mNIEdk |
||||
Nx85eRPXDlCyrLoZnuqD5EVGBL7NLzkQCJsNifBVsiYkUbNr0XxpPVjVgTU8aEdX |
||||
jcYSs88qahVFL4SpTj3BOcrr+95KnK0buGGWBiC4gCMZtHZDHJ+umjheENI49R6e |
||||
2QwR1S74yYqHpwyz0ihdI2xOZgXxmGOg3GKBxEficqLgbRl+PV2FRZdogAOl8PXt |
||||
25iCzummltrfbjXaGQNg9rBHmAM05bxgtMCQwCj0BG48ufpJhzplOLS1YYIehiHv |
||||
mojFdSg1q15SYC867zGLpnv3SAxwPLXXYsu0QsP0jbhEcYwk/NfunyHoqmOWw88H |
||||
W/KB0ppwJ1QYzO6h0Qwijl7QmUM5qlJOZxuP2jK8WoOS2jarU3r0EXfq/Nfo3uqX |
||||
xm5QDg9E4M8wyouaoaCn/LnoxS3zc/VU/p0o15AjIylPSTN/kHmDSl4eYZFmBBhd |
||||
0YhvjC4hW2UBRM12SQAAEPIaEqUdxrYFfogWojYCoymheKskXfAKdA1k2gp5mhVh |
||||
SFXeRgS5uQTbqpY= |
||||
-----END CERTIFICATE----- |
@ -0,0 +1,37 @@ |
||||
Bag Attributes |
||||
1.3.6.1.4.1.311.17.3.20: 17 A0 CD C1 E4 41 B6 3A 5B 3B CB 45 9D BD 1C C2 98 FA 86 58 |
||||
subject=/C=CH/O=SwissSign AG/CN=SwissSign Silver CA - G2 |
||||
issuer=/C=CH/O=SwissSign AG/CN=SwissSign Silver CA - G2 |
||||
-----BEGIN CERTIFICATE----- |
||||
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 |
||||
-----END CERTIFICATE----- |
Loading…
Reference in new issue