References #2
This commit is contained in:
16
Test_Qt_Frontend/QtSslTest.pro
Normal file
16
Test_Qt_Frontend/QtSslTest.pro
Normal file
@@ -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
|
37
Test_Qt_Frontend/pindialog.cpp
Normal file
37
Test_Qt_Frontend/pindialog.cpp
Normal file
@@ -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() : "";
|
||||
}
|
22
Test_Qt_Frontend/pindialog.h
Normal file
22
Test_Qt_Frontend/pindialog.h
Normal file
@@ -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
|
48
Test_Qt_Frontend/qtssltest.cpp
Normal file
48
Test_Qt_Frontend/qtssltest.cpp
Normal file
@@ -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;
|
||||
}
|
162
Test_Qt_Frontend/smartcardauth.cpp
Normal file
162
Test_Qt_Frontend/smartcardauth.cpp
Normal file
@@ -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;
|
||||
}
|
27
Test_Qt_Frontend/smartcardauth.h
Normal file
27
Test_Qt_Frontend/smartcardauth.h
Normal file
@@ -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
|
39
Test_Qt_Frontend/swsign_cert.pem
Normal file
39
Test_Qt_Frontend/swsign_cert.pem
Normal file
@@ -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-----
|
41
Test_Qt_Frontend/swsign_interm.pem
Normal file
41
Test_Qt_Frontend/swsign_interm.pem
Normal file
@@ -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-----
|
37
Test_Qt_Frontend/swsign_root.pem
Normal file
37
Test_Qt_Frontend/swsign_root.pem
Normal file
@@ -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-----
|
Reference in New Issue
Block a user