2016-12-06 220 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根的信任链由服务器连同服务器证书发出的证书链建立。当您通过网络浏览器连接到服务器时,确保事情正常工作。 –