2016-12-06 222 views
0

我在Godaddy上購買了證書。 從他們那裏,我得到了三個文件:certificate.crt,certificatechain.crt,private.key證書鏈的根證書是自簽名的,不可信的

我有一個QT應用程序與SSL通信到運行Flask的Ubuntu服務器。

該網站正在運行並在https上運行。

我在Apache方面沒有任何問題,但在這裏我如何使用證書。

在/etc/apache2/site-enabled/MyFlaskApp.conf

SSLEngine on 
SSLCertificateFile  /etc/ssl/certificate.crt 
SSLCertificateKeyFile /etc/ssl/private.key 
SSLCertificateChainFile /etc/ssl/certificatechain.crt 

在QT:

void InitSSL() 
{ 
    m_sslConfiguration.setProtocol(QSsl::TlsV1_2); 

    // Set certificate to configuration 
    QFile certFile; 
    certFile.setFileName(path_certificate); 
    if(certFile.open(QIODevice::ReadOnly)) 
    { 
     QList<QSslCertificate> certificates; 
     QSslCertificate certificate(&certFile, QSsl::Der); 
     certificates.append(certificate); 
     m_sslConfiguration.setCaCertificates(certificates); 
    } 

    QFile certChain; 
    certChain.setFileName(path_certificate_chain); 
    if(certChain.open(QIODevice::ReadOnly)) 
    { 
     QList<QSslCertificate> certificates; 
     QSslCertificate certificate(&certChain, QSsl::Der); 
     certificates.append(certificate); 
     m_sslConfiguration.setLocalCertificateChain(certificates); 
    } 

    QFile keyFile; 
    keyFile.setFileName(DATABASE_PATH + DATABASE_KEY_PATH_SSL); 
    if(keyFile.open(QIODevice::ReadOnly)) 
    { 
     QSslKey key= QSslKey(keyFile.readAll(), QSsl::Rsa); 
     m_sslConfiguration.setPrivateKey(key); 
    } 
} 

我總是得到一個SSL錯誤的說法,該證書鏈的根證書自簽名,不可信「

這是不是自簽名,我在GoDaddy上購買了證書

另外,讓我知道如果QT應用程序在Windows或Ubuntu上運行會產生什麼差異。

謝謝

回答

1

它看起來像你在你的代碼中混合證書文件和鏈文件。您將本地證書設置爲CA證書鏈,將CA證書鏈文件設置爲完整證書鏈。您還需要從鏈文件中加載所有CA證書。我假設certificate.crt只包含本地證書文件,並且certificatechain.crt僅包含中間證書而不包含本地證書。

另一方面,你想達到什麼目的?您是否啓用了客戶端和服務器端身份驗證,因爲您在客戶端設置了本地證書和密鑰?在這種情況下,你顯然應該有兩套證書。

無論如何,你可以嘗試下面的代碼來配置你的Qt應用程序。 Qt是一個跨平臺的環境,所以如果你在兩個平臺上都配置了相同的openssl版本,就不會有差異。

void InitSSL() 
{ 
    m_sslConfiguration.setProtocol(QSsl::TlsV1_2); 

    // Set certificate to configuration 
    QFile certificate_file(path_certificate); 
    if (!certificate_file.open(QIODevice::ReadOnly)) 
    { 
     qWarning() << "error opening certificate file" 
        << QDir::current().absoluteFilePath(certificate_file.fileName()); 
     return; 
    } 

    QSslCertificate certificate(&certificate_file, QSsl::Der); 
    certificate_file.close(); 
    if (!certificate.isValid()) 
    { 
     qWarning() << "Certificate " << rCertificateFileName << " is not valid:" 
        << "valid from " << certificate.effectiveDate().toString("yyyy-MM-dd") 
        << " to " << certificate.expiryDate().toString("yyyy-MM-dd"); 
     return; 
    } 
    m_sslConfiguration.setLocalCertificate(certificate); 

    // Set CA chain to configuration 
    QList<QSslCertificate> ca_certificates = QSslCertificate::fromPath(path_certificate_chain, QSsl::Der); 
    if (ca_certificates.isEmpty()) 
    { 
     qWarning() << "error loading CA certificates from file " << path_certificate_chain; 
     return; 
    } 
    m_sslConfiguration.setCaCertificates(ca_certificates); 

    // Set key to configuration 
    QString key_file_path(DATABASE_PATH + DATABASE_KEY_PATH_SSL); 
    QFile key_file(key_file_path); 
    if (!key_file.open(QIODevice::ReadOnly)) 
    { 
     qWarning() << "Error opening key file " 
        << QDir::current().absoluteFilePath(key_file.fileName()); 
     return; 
    } 
    QSslKey key(&key_file, QSsl::Rsa); 
    key_file.close(); 
    if (key.isNull()) 
    { 
     qWarning() << "Key " << key_file_path << " is null"; 
     return; 
    } 
    m_sslConfiguration.setPrivateKey(key); 
} 

相反的QSslCertificate::fromPath您可以從該文件還與QSslCertificate::fromDataQSslCertificate::fromDevice加載CA證書。

您確定證書文件是DER格式嗎?如果他們是PEM,您可以刪除QSsl::Der,因爲QSsl::Pem是默認設置。

+0

你指出它問「你想達到什麼?」。我有點困惑。我在Apache服務器上設置了.crt和.key。我的網站在https://上運行。客戶端(QT)需要什麼來驗證接收到的.crt是否可信?當我只使用「m_sslConf.setProtocol(QSsl :: TlsV1_2);」時,我通過SSL正確地將文件傳輸到服務器,但它是否安全?我不明白如何在QT中正確設置我的SSL連接,以便驗證收到的.crt文件。 – vincedjango

+1

@vincedjango「客戶端(QT)需要什麼來驗證收到的.crt是否可信?」沒有。 Qt使用OpenSSL,並附帶它自己的一組可信任證書。如果您的服務器設置正確,它應該直接開箱即用:Qt應該拒絕與不可信證書的服務器的連接。來自CA根的信任鏈由服務器連同服務器證書發出的證書鏈建立。當您通過網絡瀏覽器連接到服務器時,確保事情正常工作。 –