Qt рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рднрд░рдирд╛ - рдПрд╕рдПрд╕рдПрд▓ рдХреБрдВрдЬреА рдЬреЗрдирд░реЗрд╢рди

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХреНрдпреВрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

#ifndef SSLKEYGEN_H #define SSLKEYGEN_H #include <QtGui/QDialog> #include <QSslKey> #include <QMap> #include <QSslCertificate> #include <QWizard> #include <QWizardPage> #include <QProgressBar> #include <QDir> #include <QFileDialog> #include <QFileInfo> #include <QFile> #include <QLabel> bool isPrivateKeyCorrespondsToCertificate(QSslCertificate cert, QSslKey key); class CertificateGeneratorWizard : public QWizard { Q_OBJECT public: CertificateGeneratorWizard(QWidget * parent=0); QSslKey getPrivateKey(){return pkey;} QSslCertificate getCertificate(){return cert;} void accept(); private: QSslKey pkey; QSslCertificate cert; }; class RandSeeder : public QObject { Q_OBJECT public: void startSeeding(QList<QWidget *> w, int lim); void stop(); bool isCompleted() const{return (counter>=maximum);} protected: QMap<QWidget *, bool> wdgs; int counter; int maximum; bool eventFilter(QObject *obj, QEvent *event); signals: void step(); void stopped(); }; class getCertDataPage : public QWizardPage { Q_OBJECT public: getCertDataPage(QWidget *parent=0); }; class randomizePage : public QWizardPage { Q_OBJECT public: randomizePage(QWidget *parent=0); virtual void cleanupPage(); virtual void initializePage(); virtual bool isComplete() const; private: QProgressBar * progressBar; QLabel * label; RandSeeder seeder; private slots: void seedStep(); void seedStopped(); }; #endif // SSLKEYGEN_H
      
      





рдкрд╣рд▓рд╛ рдШреЛрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди, PrivateKeyCorrespondsToCertkut рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ, рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдПрдХ рдХреБрдВрдЬреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬреЛ Qt рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЪреВрдХ рднреА рд╣реИред рдпрд╣рд╛рдБ sslkeygen.cpp рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЙрд╕рдХрд╛ рдХреЛрдб рд╣реИ:

 bool isPrivateKeyCorrespondsToCertificate( QSslCertificate cert, QSslKey key ) { X509 *x; EVP_PKEY *k; x=(X509 *)cert.handle(); k=EVP_PKEY_new(); if(key.algorithm() == QSsl::Rsa) EVP_PKEY_assign_RSA(k, (RSA *)key.handle()); else EVP_PKEY_assign_DSA(k, (DSA *)key.handle()); if(X509_check_private_key(x,k)==1) return true; return false; }
      
      





рдпрджрд┐ рдЖрдк рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ (рдпрд╣ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ - рдЬреИрд╕реЗ рдХрд┐ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛)

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШреЛрд╖рдгрд╛рдПрдБ рдкреНрд░рдореБрдЦ рдкреАрдврд╝реА рдХреЗ рдЬрд╛рджреВрдЧрд░ рдФрд░ рдЙрд╕рдХреЗ рдкреГрд╖реНрда рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИрдВред RandSeeder рд╡рд░реНрдЧ рдХреБрдЫ рд╣рдж рддрдХ рдЕрд▓рдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдмрд╛рдж рдореЗрдВ рдирд╣реАрдВред

рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рд▓реЗрдЦ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рддреБрд░рдВрдд рдХреЛрдб рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдПрдХ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдореИрдВ рд╕реАрдзреЗ рдХреНрдпреВрдЯреА рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЪреЛрд░реА рдХрд░рддрд╛ рд╣реВрдВ (рдЯреНрд░реЛрд▓рдЯреЗрдХ-рдиреЛрдХрд┐рдпрд╛ рдиреЗ рдореБрдЭреЗ рдорд╛рдл рдХрд░ рджрд┐рдпрд╛):

 QByteArray QByteArray_from_X509(X509 *x509) { if (!x509) return QByteArray(); // Use i2d_X509 to convert the X509 to an array. int length = i2d_X509(x509, 0); QByteArray array; array.resize(length); char *data = array.data(); char **dataP = &data; unsigned char **dataPu = (unsigned char **)dataP; if (i2d_X509(x509, dataPu) < 0) return QByteArray(); // Convert to Base64 - wrap at 64 characters. array = array.toBase64(); QByteArray tmp; for (int i = 0; i < array.size() - 64; i += 64) { tmp += QByteArray::fromRawData(array.data() + i, 64); tmp += "\n"; } if (int remainder = array.size() % 64) { tmp += QByteArray::fromRawData(array.data() + array.size() - remainder, remainder); tmp += "\n"; } return "-----BEGIN CERTIFICATE-----\n" + tmp + "-----END CERTIFICATE-----\n"; }
      
      





рдлрд╝рдВрдХреНрд╢рди рдЖрдВрддрд░рд┐рдХ OpenSSL рджреГрд╢реНрдп рд╕реЗ X509 рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдЯреЛрд░ рдХреЛ QByteArray рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ QSslCertificate рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рдореБрдЦ рдкреАрдврд╝реА рдХреЗ рдЬрд╛рджреВрдЧрд░ рдХреЗ рд▓рд┐рдП рдХреЗ рд░реВрдк рдореЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рд╕рднреА рд╡рд░реНрдЧ рдХреЛрдб рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реЛрддрд╛ рд╣реИ:

 getCertDataPage::getCertDataPage( QWidget *parent ) : QWizardPage(parent) { setTitle(" "); QVBoxLayout * verticalLayout = new QVBoxLayout(); QLabel * label = new QLabel(tr("   .   .")); label->setWordWrap(true); verticalLayout->addWidget(label); QHBoxLayout * horizontalLayout = new QHBoxLayout(); label = new QLabel(tr("&:")); label->setMinimumSize(QSize(80, 0)); horizontalLayout->addWidget(label); QLineEdit * lineEdit = new QLineEdit(); horizontalLayout->addWidget(lineEdit); label->setBuddy(lineEdit); verticalLayout->addLayout(horizontalLayout); registerField("certSubject*",lineEdit); horizontalLayout = new QHBoxLayout(); label = new QLabel(tr("&:")); label->setMinimumSize(QSize(80, 0)); horizontalLayout->addWidget(label); lineEdit = new QLineEdit(); horizontalLayout->addWidget(lineEdit); label->setBuddy(lineEdit); verticalLayout->addLayout(horizontalLayout); registerField("certOrganization*",lineEdit); horizontalLayout = new QHBoxLayout(); label = new QLabel(tr("&E-Mail:")); label->setMinimumSize(QSize(80, 0)); horizontalLayout->addWidget(label); lineEdit = new QLineEdit(); horizontalLayout->addWidget(lineEdit); label->setBuddy(lineEdit); verticalLayout->addLayout(horizontalLayout); registerField("certEMail*",lineEdit); setLayout(verticalLayout); }
      
      





рдпрд╣ рдПрдХ рд╕рд░рд▓ рдкреГрд╖реНрда рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рдлрд╝реАрд▓реНрдб рдмрдирд╛рддрд╛ рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рддреАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдЬрд╛рджреВрдЧрд░ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдЪреНрдЫреА рдПрдиреНрдЯреНрд░рд╛рдкреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрд╛рдКрдБрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдВрдЬреА рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИ (рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рдХреЗ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд╕рдВрдХреЗрддрдХ рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ)ред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдЙрд╕ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдорд╛рдЙрд╕ рдХреЛ рд╕рд╛рдЗрдб рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо RandSeeder рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:

 bool RandSeeder::eventFilter( QObject *obj, QEvent *event ) { if(event->type() == QEvent::MouseMove) { uint addition=QDateTime::currentDateTime().toTime_t(); QMouseEvent *mEvent = static_cast<QMouseEvent *>(event); addition*=mEvent->globalX(); addition*=mEvent->globalY(); RAND_seed(&addition,sizeof(uint)); counter++; emit step(); if(counter>maximum) stop(); return true; } else return QObject::eventFilter(obj, event); } void RandSeeder::startSeeding( QList<QWidget *> w, int lim ) { counter=0; if(lim<512) lim=512; maximum=lim; int i; for(i=0;i<w.count();i++) { wdgs.insert(w.at(i),w.at(i)->hasMouseTracking()); w.at(i)->installEventFilter(this); w.at(i)->setMouseTracking(true); } } void RandSeeder::stop() { QList<QWidget *> w=wdgs.keys(); int i; bool mt; for(i=0;i<w.count();i++) { mt=wdgs.value(w.at(i)); wdgs.remove(w.at(i)); w.at(i)->setMouseTracking(mt); w.at(i)->removeEventFilter(this); } emit stopped(); }
      
      





рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЬрд╛рджреВрдЧрд░ рдХреЗ рджреВрд╕рд░реЗ рдкреГрд╖реНрда рдкрд░ RandSeeder рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 randomizePage::randomizePage( QWidget *parent ) : QWizardPage(parent) { setTitle(" "); setFinalPage(true); QVBoxLayout * verticalLayout = new QVBoxLayout(); label = new QLabel(tr("        .")); label->setWordWrap(true); verticalLayout->addWidget(label); progressBar = new QProgressBar(); progressBar->setMaximum(1024); progressBar->setValue(0); verticalLayout->addWidget(progressBar); setLayout(verticalLayout); connect(&seeder, SIGNAL(step()), this, SLOT(seedStep())); connect(&seeder, SIGNAL(stopped()), this, SLOT(seedStopped())); } void randomizePage::seedStep() { progressBar->setValue(progressBar->value()+1); } void randomizePage::cleanupPage() { seeder.stop(); progressBar->setValue(0); } void randomizePage::initializePage() { progressBar->setValue(0); progressBar->setMaximum(1024); QList<QWidget *> wlst, chwdg; wlst << this << wizard() << progressBar << label; int i; chwdg=wizard()->findChildren<QWidget *>(); for(i=0;i<chwdg.count();i++) { if(!wlst.contains(chwdg.at(i))) wlst.append(chwdg.at(i)); } seeder.startSeeding(wlst ,1024); } void randomizePage::seedStopped() { if(seeder.isCompleted()) emit completeChanged(); } bool randomizePage::isComplete() const { if(seeder.isCompleted()) return true; return false; }
      
      





рд╣рдорд╛рд░рд╛ RandSeeder рд╡рд░реНрдЧ рдПрдВрдЯреНрд░реЛрдкреА рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╣рд░ рдХрджрдо рдкрд░ рд╢реБрд░реБрдЖрдд, рдЕрдВрдд рдФрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╣рдо рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдкреГрд╖реНрда рдкрд░ рдЗрди рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкреНрд░рдЧрддрд┐ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рдЕрдЧрд▓реЗ рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЯрди рд╕рдорд╛рдпреЛрдЬрди рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реА рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдорд╛рдпреЛрдЬрди initializePage рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдФрд░ рдЕрдм, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдХреБрдВрдЬреА рдФрд░ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдкреНрд░рдореБрдЦ рдкреАрдврд╝реА рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдХреЗ рд╕реНрд╡реАрдХрд╛рд░ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЗрд╕реЗ рджреЗрдЦреЗрдВ, рдЬрд╛рджреВрдЧрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рджреЗрдЦреЗрдВ:

 CertificateGeneratorWizard::CertificateGeneratorWizard(QWidget * parent) : QWizard(parent) { setOption(QWizard::NoCancelButton, false); setOption(QWizard::NoDefaultButton, false); setOption(QWizard::CancelButtonOnLeft, true); addPage(new getCertDataPage); addPage(new randomizePage); setWindowTitle(tr("   ")); }
      
      





рдпрд╣ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ - рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рд╕реЗрдЯ рдХрд░реЗрдВ (рдЕрдкрдиреЗ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП, рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ), рд╣рдорд╛рд░реЗ рдкреГрд╖реНрда рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╢реАрд░реНрд╖рдХ рд╕реЗрдЯ рдХрд░реЗрдВред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдЬрдирд░реЗрдЯрд░:

 void CertificateGeneratorWizard::accept() { EVP_PKEY *pk; RSA *rsa; X509 *x; X509_NAME *name=NULL; bool ok; //parameters int bits=4096; long serial=57; long days=1895; setCursor(Qt::WaitCursor); //create private key pk=EVP_PKEY_new(); rsa=RSA_generate_key(bits,RSA_F4,NULL,NULL); EVP_PKEY_assign_RSA(pk,rsa); { //save it to QSslKey BIO *bio = BIO_new(BIO_s_mem()); PEM_write_bio_RSAPrivateKey(bio, rsa, (const EVP_CIPHER *)0, NULL, 0, 0, 0); QByteArray pem; char *data; long size = BIO_get_mem_data(bio, &data); pem = QByteArray(data, size); BIO_free(bio); pkey=QSslKey(pem,QSsl::Rsa); ok=!pkey.isNull(); } x=X509_new(); X509_set_version(x,2); ASN1_INTEGER_set(X509_get_serialNumber(x),serial); X509_gmtime_adj(X509_get_notBefore(x),(long)60*60*24*(-2)); X509_gmtime_adj(X509_get_notAfter(x),(long)60*60*24*days); X509_set_pubkey(x,pk); name=X509_get_subject_name(x); QVariant fldVal=field("certSubject"); X509_NAME_add_entry_by_txt(name,"CN", MBSTRING_ASC, fldVal.toString().toLatin1().constData(), -1, -1, 0); fldVal=field("certOrganization"); if(!fldVal.isNull()) X509_NAME_add_entry_by_txt(name,"O", MBSTRING_ASC, fldVal.toString().toLatin1().constData(), -1, -1, 0); fldVal=field("certEMail"); if(!fldVal.isNull()) { X509_NAME_add_entry_by_txt(name,"emailAddress", MBSTRING_ASC, fldVal.toString().toLatin1().constData(), -1, -1, 0); } X509_set_issuer_name(x,name); X509_sign(x,pk,EVP_md5()); { QByteArray crt=QByteArray_from_X509(x); cert=QSslCertificate(crt); ok=cert.isValid(); } ok=isPrivateKeyCorrespondsToCertificate(cert,pkey); QWizard::accept(); }
      
      





рдкрд╣рд▓реЗ рд╣рдо рдПрдХ рдирд┐рдЬреА рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ред рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдпрджрд┐ рдЖрдк рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рднрд░рдирд╛ рд╣реЛрдЧрд╛ред рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВ, рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред

рдЦреИрд░, рдпрд╣ рдмрд╛рдд рд╣реИред



All Articles