c++ - 证书链的根证书是自签名的,不受信任的

标签 c++ apache qt ubuntu

我在 Godaddy 上购买了证书。 从他们那里,我得到了三个文件:certificate.crt、certifichain.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 上运行会有什么不同。

谢谢

最佳答案

看起来您在代码中混合了证书文件和链文件。您将本地证书设置为 CA 证书链,将 CA 证书链文件设置为完整证书链。您还需要从链文件中加载所有 CA 证书。我假设 certificate.crt 仅包含本地证书文件,而 certificatechain.crt 仅包含中间证书而不包含本地证书。

另一方面,你想达到什么目的?您是否因为在客户端设置本地证书和 key 而同时启用了客户端和服务器端身份验证?在那种情况下,您显然应该拥有两套证书。

无论如何,您可以尝试使用以下代码来配置您的 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::fromData 从文件中加载 CA 证书或 QSslCertificate::fromDevice .

您确定证书文件是 DER 格式吗?如果它们是 PEM,您可以删除 QSsl::Der,因为 QSsl::Pem 是默认值。

关于c++ - 证书链的根证书是自签名的,不受信任的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41006471/

相关文章:

C++ 警告 C4244 'return' : conversion from 'double' to 'int' , 可能丢失数据 Visual Studio 2015

c++ - MSVC Address Sanitizer - 有什么理由在发布版本中使用它吗?

c++ - Qt QApplication::commitData、Windows 关闭、困惑的文档

c++ - QMap 通过指针或值插入 QVector<QString>?

c++ - WSL 中的 g++ 创建了一个不可删除的文件

c++ - 为什么const成员函数可以通过成员指针调用非const成员函数?

c - 为什么这个 cgi 脚本不起作用,但在/var/www/cgi-bin/中执行时它可以作为独立程序完美运行?

java - 在java中创建本地http监听器

mysql - 加载页面 localhost/phpmyadmin 时出错

c++ - 无法使用 Reddit API 通过仅应用程序 OAuth 检索访问 token