1

Je l'ai essayé quelques fois maintenant mais je n'ai pas réussi à le faire fonctionner. Je veux pousser quelques notifications d'une application Qt. Je ai essayé de le faire fonctionner sur macOS Sierra avec l'installation Qt 5.8 et sur Pi3 aussi avec Qt 5.8.Qt 5.8 Echec de la prise de contact du serveur de notification Apple

J'ai créé mon certificat push avec "fastlane pem" et je l'ai testé avec "Pusher" et cela fonctionne correctement. Mais je ne peux pas l'obtenir pour travailler dans Qt ....

Tout d'abord le code que j'utilise pour initialiser et connecter le QSslSocket:

QSslSocket * ssl = new QSslSocket; 

connect(ssl, &QSslSocket::encrypted, this, &IOSPusher::encrypted); 
connect(ssl, static_cast<void(QSslSocket::*)(const QList<QSslError> &)>(&QSslSocket::sslErrors),this,&IOSPusher::sslErrors); 
connect(ssl, static_cast<void(QSslSocket::*)(QAbstractSocket::SocketError)>(&QSslSocket::error),this, &IOSPusher::error); 
connect(ssl,&QSslSocket::stateChanged,this,&IOSPusher::stateChanged); 

Chargement du certificat

QString path = QStandardPaths::writableLocation(certificateLocation) + "/apns.pem"; 

const auto certs = QSslCertificate::fromPath(path); 

if(certs.count() > 0){ 
    qDebug() << "IOSPusher: Certificate loaded successfully"; 
}else{ 
    qDebug() << "Could not load certificate : " + path; 
} 

QSslConfiguration config = QSslConfiguration::defaultConfiguration(); 
config.setCaCertificates(certs); 

ssl->setSslConfiguration(config); 
ssl->connectToHostEncrypted(gateway.sandbox.push.apple.com,2195); 

Et c'est la sortie i obtenir:

IOSPusher: Certificate loaded successfully 
IOSPusher::stateChanged QAbstractSocket::HostLookupState 
IOSPusher::stateChanged QAbstractSocket::ConnectingState 
IOSPusher::stateChanged QAbstractSocket::ConnectedState 
IOSPusher::error QAbstractSocket::SocketError(13) 
IOSPusher::stateChanged QAbstractSocket::ClosingState 
IOSPusher::stateChanged QAbstractSocket::UnconnectedState 

Ainsi, selon la documentation Qt l'erreur:

QAbstractSocket::SocketError(13)

signifie:

SslHandshakeFailedError

Et

> la poignée de main SSL/TLS a échoué et n'a pas pu être établie la chaîne cryptée. Le signal sslErrors() aurait dû être émis.

Mais le signal sslErrors() ne sera pas émis dans mon cas ....

The SSL/TLS handshake failed, so the connection was closed (only used in QSslSocket)

Toutes les idées ou échantillons comment je peux établir une connexion cryptée à la pomme?

Merci d'avance!

Répondre

0

Bon comme si souvent lorsque je tente d'obtenir de l'aide à quelqu'un, je suis maintenant: D

La solution qui a fonctionné pour moi est maintenant:

Créer le *.pem cert avec fastlane pem avec un mot de passe (peut-être il fonctionne sans mot de passe aussi, mais qui était le dernier je l'ai essayé et maintenant .... jamais changer un système de fonctionnement haha)

fastlane pem --development -p <private_key_password> -a <your_app_identifier> 

ensuite de se connecter avec le QSslSocket faire ce qui suit ... comme avant dans ma question. ..

QSslSocket * ssl = new QSslSocket; 
QString path = QStandardPaths::writableLocation(certificateLocation) + "/apns.pem"; 

connect(ssl, &QSslSocket::encrypted, this, &IOSPusher::encrypted); 
connect(ssl, static_cast<void(QSslSocket::*)(const QList<QSslError> &)>(&QSslSocket::sslErrors),this,&IOSPusher::sslErrors); 
connect(ssl, static_cast<void(QSslSocket::*)(QAbstractSocket::SocketError)>(&QSslSocket::error),this, &IOSPusher::error); 
connect(ssl,&QSslSocket::stateChanged,this,&IOSPusher::stateChanged); 

QSslCertificate cert; 
const auto certs = QSslCertificate::fromPath(path); 

if(certs.count() > 0){ 
    cert = certs.at(0); 
    qDebug() << "IOSPusher: Certificate loaded successfully"; 
}else{ 
    qDebug() << "Could not load certificate : " + path; 
    return false; 
} 

Maintenant vient la magie ici ce qu'il a fait pour moi

Utilisez le private_key (.pkey) fichier qui sera également créé avec fastlane pem

//Use the path to the .pkey file from fastlane 
QFile keyfile(path + "/apns.pkey"); 
keyfile.open(QFile::ReadOnly); 

//Create the QSslKey as private key 
QSslKey privateKey(&keyfile,QSsl::Rsa,QSsl::Pem,QSsl::PrivateKey,QByteArray("<private_key_password_from_fastlane>")); 
//Close the file 
keyfile.close(); 

et ajoutez la clé privée et le certificat au que vous pouvez voir ici cette fois config ssl

QSslConfiguration config = QSslConfiguration::defaultConfiguration(); 

config.setLocalCertificate(cert); 
config.setPrivateKey(privateKey); 

-je pas utiliser la méthode config.setCaCertificates mais au lieu de la méthode config.setLocalCertificate. C'était une erreur de mon côté ...

Au moins ajouter la config à la prise ssl et le feu!

ssl->setSslConfiguration(config); 
ssl->connectToHostEncrypted("gateway.sandbox.push.apple.com",2195); 

C'est tout

Maintenant, le signal émis encrypted() se! Ouais ..