Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用C+;使用SSL证书登录+;,Qt和Betfair API-NG 我正在用QT编写C++中的一个新的BeFaldBoT程序,但是我在登录过程中的第一个障碍中掉了下来。经过大量阅读,我决定使用QNetworkAccessManager,这就是我目前拥有的: int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); BetfairManager bet_man; QNetworkAccessManager *manager = new QNetworkAccessManager(); QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), &bet_man,SLOT(replyFinished(QNetworkReply*))); QObject::connect(manager,SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), &bet_man,SLOT(replySSLErrors(QNetworkReply*,QList<QSslError>))); QObject::connect(manager,SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), &bet_man,SLOT(replyAuthenticationRequired(QNetworkReply*,QAuthenticator*))); QObject::connect(manager,SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*)), &bet_man,SLOT(replyProxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*))); QNetworkRequest request; QByteArray payload("username=myusername&password=mypassword"); QString url("https://identitysso.betfair.com/api/certlogin"); QSslConfiguration config; QString pemfile("../../client-2048.pem"); QFile file(pemfile); if(!file.exists()) { qWarning("Filename %s doesn't exists.", qPrintable(pemfile)); } if(!file.open(QIODevice::ReadOnly)) { qWarning("Cannot open filename %s.", qPrintable(pemfile)); } QByteArray data = file.readAll(); QSslCertificate sslcert(data, QSsl::Pem); if(sslcert.isNull()) { qWarning("The certificate has no content."); } config.setLocalCertificate(sslcert); request.setSslConfiguration(config); request.setUrl(url); request.setRawHeader("X-Application","mykey"); request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); manager->post(request,payload); return a.exec(); }_C++_Qt_Https_Ssl Certificate_Betfair - Fatal编程技术网

无法使用C+;使用SSL证书登录+;,Qt和Betfair API-NG 我正在用QT编写C++中的一个新的BeFaldBoT程序,但是我在登录过程中的第一个障碍中掉了下来。经过大量阅读,我决定使用QNetworkAccessManager,这就是我目前拥有的: int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); BetfairManager bet_man; QNetworkAccessManager *manager = new QNetworkAccessManager(); QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), &bet_man,SLOT(replyFinished(QNetworkReply*))); QObject::connect(manager,SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), &bet_man,SLOT(replySSLErrors(QNetworkReply*,QList<QSslError>))); QObject::connect(manager,SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), &bet_man,SLOT(replyAuthenticationRequired(QNetworkReply*,QAuthenticator*))); QObject::connect(manager,SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*)), &bet_man,SLOT(replyProxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*))); QNetworkRequest request; QByteArray payload("username=myusername&password=mypassword"); QString url("https://identitysso.betfair.com/api/certlogin"); QSslConfiguration config; QString pemfile("../../client-2048.pem"); QFile file(pemfile); if(!file.exists()) { qWarning("Filename %s doesn't exists.", qPrintable(pemfile)); } if(!file.open(QIODevice::ReadOnly)) { qWarning("Cannot open filename %s.", qPrintable(pemfile)); } QByteArray data = file.readAll(); QSslCertificate sslcert(data, QSsl::Pem); if(sslcert.isNull()) { qWarning("The certificate has no content."); } config.setLocalCertificate(sslcert); request.setSslConfiguration(config); request.setUrl(url); request.setRawHeader("X-Application","mykey"); request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); manager->post(request,payload); return a.exec(); }

无法使用C+;使用SSL证书登录+;,Qt和Betfair API-NG 我正在用QT编写C++中的一个新的BeFaldBoT程序,但是我在登录过程中的第一个障碍中掉了下来。经过大量阅读,我决定使用QNetworkAccessManager,这就是我目前拥有的: int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); BetfairManager bet_man; QNetworkAccessManager *manager = new QNetworkAccessManager(); QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), &bet_man,SLOT(replyFinished(QNetworkReply*))); QObject::connect(manager,SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), &bet_man,SLOT(replySSLErrors(QNetworkReply*,QList<QSslError>))); QObject::connect(manager,SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), &bet_man,SLOT(replyAuthenticationRequired(QNetworkReply*,QAuthenticator*))); QObject::connect(manager,SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*)), &bet_man,SLOT(replyProxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*))); QNetworkRequest request; QByteArray payload("username=myusername&password=mypassword"); QString url("https://identitysso.betfair.com/api/certlogin"); QSslConfiguration config; QString pemfile("../../client-2048.pem"); QFile file(pemfile); if(!file.exists()) { qWarning("Filename %s doesn't exists.", qPrintable(pemfile)); } if(!file.open(QIODevice::ReadOnly)) { qWarning("Cannot open filename %s.", qPrintable(pemfile)); } QByteArray data = file.readAll(); QSslCertificate sslcert(data, QSsl::Pem); if(sslcert.isNull()) { qWarning("The certificate has no content."); } config.setLocalCertificate(sslcert); request.setSslConfiguration(config); request.setUrl(url); request.setRawHeader("X-Application","mykey"); request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); manager->post(request,payload); return a.exec(); },c++,qt,https,ssl-certificate,betfair,C++,Qt,Https,Ssl Certificate,Betfair,我得到了答复 "{"loginStatus":"CERT_AUTH_REQUIRED"}" 这并不奇怪,但表明我在请求中传递了正确的参数,因此我确信问题在于我的Qt类的证书传递机制/创建 我已经根据betfair文档创建了.pem文件(它说通过附加生成的.crt和.key文件来创建它),我知道它们很好,因为我还有一个Python机器人,它可以完美地使用相同的文件 我是Qt新手,不是SSL专家,我觉得我缺少一些基本的东西 如果有用的话,这里是我的Python等效代码,它使用urllib2包可以完

我得到了答复

"{"loginStatus":"CERT_AUTH_REQUIRED"}"
这并不奇怪,但表明我在请求中传递了正确的参数,因此我确信问题在于我的Qt类的证书传递机制/创建

我已经根据betfair文档创建了.pem文件(它说通过附加生成的.crt和.key文件来创建它),我知道它们很好,因为我还有一个Python机器人,它可以完美地使用相同的文件

我是Qt新手,不是SSL专家,我觉得我缺少一些基本的东西

如果有用的话,这里是我的Python等效代码,它使用
urllib2
包可以完美地工作

un = "myusername";
pw = "mypassword";
app_key = 'mykey'

payload = 'username=' + un + '&password=' + pw
login_headers = {'X-Application': app_key, 'Content-Type': 'application/x-www-form-urlencoded'}
resp = requests.post('https://identitysso.betfair.com/api/certlogin', data=payload, cert=('client-2048.crt', 'client-2048.key'), headers=login_headers)

我正在Ubuntu 14.04上使用Qt5.2.1开发此功能。当您想使用客户端证书通过SSL连接登录时,需要另外指定客户端的私钥。证书基本上只是一个公钥,由其他人检查。当您可以向服务器证明您也拥有证书的私钥时,将授予访问权限

可以使用以下方法执行此操作:

// get certData and keyData from files

QSslConfiguration config;

QSslCertificate sslcert(certData, QSsl::Der);
config.setLocalCertificate(sslcert);

QSslKey privkey(keyData, QSsl::Rsa, QSsl::Der, QSsl::PrivateKey, "myKeyPassword")
config.​setPrivateKey(privkey);

当原始文件
client-2048.crt
client-2048.key
都是二进制文件时,它们很可能以DER格式存储。在这种情况下,您可以如上所述指定输入格式,无需转换任何内容。

非常感谢,先生!!这已经修复了它(尽管我需要使用QSsl::Pem而不是QSsl::Der)。如果我可以问一下,您是否采取了任何特殊步骤来让
“https”
url正常工作?如果是的话,我很想知道。@NicholasJohnson说实话,我想不起来有什么。你能发布完整的Src代码吗?我愿意再看一遍这封信。
// get certData and keyData from files

QSslConfiguration config;

QSslCertificate sslcert(certData, QSsl::Der);
config.setLocalCertificate(sslcert);

QSslKey privkey(keyData, QSsl::Rsa, QSsl::Der, QSsl::PrivateKey, "myKeyPassword")
config.​setPrivateKey(privkey);