建议阅读:
*.csr文件:证书签名请求文件
*.key文件:私钥文件
*.crt文件:证书文件
一、描述
QSslCertificate 存储 X509 证书结构(struct),通常用于验证身份并存储有关本地主机、远程连接的对等方或受信任的第三方证书颁发机构的信息。
二、类型成员
1、enum QSslCertificate::SubjectInfo:描述传递给 issuerInfo() 或 subjectInfo() 以获取有关证书颁发者或主题的信息的密钥。
- Organization:“O” 组织名称。
- CommonName:“CN”通用名称; 大多数情况下,这用于存储主机名。
- LocalityName:“L” 地区。
- OrganizationalUnitName:“OU” 组织单位名称。
- CountryName:“C” 国家。
- StateOrProvinceName:“ST” 州或省。
- DistinguishedNameQualifier:专有名称限定符
- SerialNumber:证书的序列号
- EmailAddress:与证书关联的电子邮件地址
三、成员函数
1、void clear()
清除此证书的内容,使其成为空证书。
2、QByteArray digest(QCryptographicHash::Algorithm algorithm = QCryptographicHash::Md5)
返回此证书的加密摘要。
3、QDateTime effectiveDate()
返回证书生效的日期时间。
4、QDateTime expiryDate()
返回证书过期的日期时间。
5、QList<QSslCertificateExtension> extensions()
返回包含此证书的 X509 扩展名的列表。
6、[static] QList<QSslCertificate> fromData(const QByteArray &data, QSsl::EncodingFormat format = QSsl::Pem)
在字节数组里解析出证书数据。
QSsl::EncodingFormat:描述证书和密钥支持的编码格式。
- QSsl::Pem:PEM 格式。
- QSsl::Der:DER 格式。
7、[static] bool importPkcs12(QIODevice *device, QSslKey *key, QSslCertificate *certificate, QList<QSslCertificate> *caCertificates = nullptr, const QByteArray &passPhrase = QByteArray())
从指定设备导入 PKCS#12 (*.pfx) 文件。 PKCS#12 文件可以包含许多证书和密钥。此方法从文件中读取单个密钥、其证书和任何关联的CA证书。 可以指定了 passPhrase(密码)。如果成功加载 PKCS#12 文件,则返回 true。(设备必须打开)
8、bool isBlacklisted()
此证书是否被列入黑名单。
9、bool isSelfSigned()
证书是否是自签名的。颁发者和主题相同则证书被认为是自签名的。
10、QString issuerDisplayName()
返回描述发行者的名称。
11、QStringList issuerInfo(QSslCertificate::SubjectInfo subject)
返回证书中主题的颁发者信息。
12、QStringList issuerInfo(const QByteArray &attribute)
返回证书中属性的颁发者信息。
13、QList<QByteArray> issuerInfoAttributes()
返回在此证书的颁发者信息中具有值的属性列表。
14、QSslKey publicKey()
返回证书主题的公钥。
15、QByteArray serialNumber()
以十六进制格式返回证书的序列号字符串。
16、QMultiMap<QSsl::AlternativeNameEntryType, QString> subjectAlternativeNames()
返回此证书的替代主题名称列表。
17、QString subjectDisplayName()
返回描述主题的名称。
18、QStringList subjectInfo(QSslCertificate::SubjectInfo subject)
返回主题信息。
19、QStringList subjectInfo(const QByteArray &attribute)
返回属性的主题信息。
20、QList<QByteArray> subjectInfoAttributes()
返回在此证书的主题信息中具有值的属性列表。
21、QByteArray toDer()
返回转换为 DER(二进制)编码表示的证书。
22、QByteArray toPem()
返回转换为 PEM (Base64) 编码表示的证书。
23、QString toText()
证书转换为可读的文本。
24、[static] QList<QSslError> verify(QList<QSslCertificate> certificateChain, const QString &hostName = QString())
验证证书链。 要验证的链在 certificateChain 参数中传递。 列表中的第一个证书应该是要验证的链的叶证书。 如果指定了 hostName,则还会检查证书以查看它是否对指定的主机名有效。
请注意,根 (CA) 证书不应包含在要验证的列表中。
25、QByteArray version()
获取证书版本。
四、使用示例
使用上面链接中的方法创建一个证书文件并查看内容(注意:要把ssleay32.dll、libeay32.dll这两个文件复制到程序运行目录):
QFile crtFile(":/server.crt");
qDebug()<<crtFile.open(QIODevice::ReadOnly);
QSslCertificate certificate(&crtFile, QSsl::Pem);
crtFile.close();
qDebug()<<certificate.isNull();
qDebug()<<certificate.issuerDisplayName();
qDebug()<<certificate.subjectDisplayName();
qDebug()<<certificate.version();
qDebug()<<certificate.serialNumber();
qDebug()<<certificate.issuerInfo(QSslCertificate::Organization);
qDebug()<<certificate.issuerInfo(QSslCertificate::CommonName);
qDebug()<<certificate.issuerInfo(QSslCertificate::LocalityName);
qDebug()<<certificate.issuerInfo(QSslCertificate::OrganizationalUnitName);
qDebug()<<certificate.issuerInfo(QSslCertificate::CountryName);
qDebug()<<certificate.issuerInfo(QSslCertificate::StateOrProvinceName);
qDebug()<<certificate.issuerInfo(QSslCertificate::DistinguishedNameQualifier);
qDebug()<<certificate.issuerInfo(QSslCertificate::SerialNumber);
qDebug()<<certificate.issuerInfo(QSslCertificate::EmailAddress)<<endl;
qDebug()<<certificate.subjectInfo(QSslCertificate::Organization);
qDebug()<<certificate.subjectInfo(QSslCertificate::CommonName);
qDebug()<<certificate.subjectInfo(QSslCertificate::LocalityName);
qDebug()<<certificate.subjectInfo(QSslCertificate::OrganizationalUnitName);
qDebug()<<certificate.subjectInfo(QSslCertificate::CountryName);
qDebug()<<certificate.subjectInfo(QSslCertificate::StateOrProvinceName);
qDebug()<<certificate.subjectInfo(QSslCertificate::DistinguishedNameQualifier);
qDebug()<<certificate.subjectInfo(QSslCertificate::SerialNumber);
qDebug()<<certificate.subjectInfo(QSslCertificate::EmailAddress)<<endl;
qDebug()<<certificate.effectiveDate();
qDebug()<<certificate.expiryDate();
// qDebug()<<certificate.toText()<<endl;
qDebug()<<certificate.subjectInfoAttributes();
qDebug()<<certificate.issuerInfoAttributes();