Ich bin neu zu Opc ua und kein Profi in Java. Beim Einrichten eines Clients in Java habe ich Probleme mit dem Zertifikats-Dealing. Ich möchte eine Verbindung zum Server über Basic 256, SignAndEncrypt herstellen. Soweit ich weiß, wird in dieser Sicherheitsstufe ein vom Client erstelltes oder geladenes Zertifikat an den Server gesendet, wo es akzeptiert werden muss. Der Server sendet dann ein Zertifikat zurück an den Client, der dann vom Client akzeptiert werden muss. Bitte korrigiere mich wenn ich falsch liege.Wie akzeptiere ich das Zertifikat von einem Server?
Erstellen/ein Zertifikat auf der Clientseite wird geladen und es an den Server gesendet hat bereits gut funktionieren (siehe Code unten) und dann kann ich es auf der Seite Server akzeptieren manuell. Aber danach stecke ich fest: Wie kann ich diese Zertifikatsüberprüfung in meinem Code sehen und wie kann ich das Serverzertifikat finden, geschweige denn akzeptieren? Ich habe den SampleConsoleClient von opc ua für einige Orientierung während der Implementierung verwendet. Aber im Gegensatz dazu verwende ich keine Benutzereingaben.
Hier einige bisher von meinem Code.
Initialisierung:
try {
client = new UaClient(serverUri);
} catch (final URISyntaxException e) {
throw new InitializationException("The server uri has an invalid syntax.", e);
}
try {
client.setApplicationIdentity(createApplicationIdentity());
} catch (final SecureIdentityException e) {
throw new InitializationException(
"Application Identity could not be created due to a Security Identity Exception.", e);
} catch (final IOException e) {
throw new InitializationException("Application Identity could not be created due to an IO Exception.",
e);
}
createApplicationIdentity():
final ApplicationDescription appDescription = new ApplicationDescription();
appDescription.setApplicationName(new LocalizedText(APPLICATION_NAME, Locale.ENGLISH));
appDescription.setApplicationUri(APPLICATION_URI);
appDescription.setProductUri(PRODUCT_URI);
appDescription.setApplicationType(ApplicationType.Client);
// Setting security features
client.setSecurityMode(SecurityMode.BASIC256_SIGN_ENCRYPT);
client.setCertificateValidator(validator);
validator.setValidationListener(myValidationListener); //myValidationListener is similar to most lines in MyCertificateValidationListener in the opc ua samples
final File privatePath = new File(validator.getBaseDir(), "private");
final KeyPair issuerCertificate = null;
final int[] keySizes = null;
final ApplicationIdentity identity = ApplicationIdentity.loadOrCreateCertificate(appDescription,
"Sample Organisation", "opcua", privatePath, issuerCertificate, keySizes, true);
identity.setApplicationDescription(appDescription);
return identity;
Nach der Initialisierung, ich versuche, so zu verbinden (mit Anmerkung, wie ich die Verbindung vorstellen, richtig funktionieren könnte):
012.351:und der Fehler wird, dass geworfen
WARN (?:?): /<IPofServer> Error org.opcfoundation.ua.common.ServiceResultException: Bad_SecurityChecksFailed
(0x80130000) "An error occurred verifying security." at
org.opcfoundation.ua.transport.tcp.io.TcpConnection$ReadThread.run(Unknown Source)
com.prosysopc.ua.client.ConnectException: Failed to create secure channel to server: : opc.tcp://<IPofServer>
[http://opcfoundation.org/UA/SecurityPolicy#Basic256,SignAndEncrypt]
ServiceResult=Bad_SecurityChecksFailed (0x80130000) "An error occurred verifying security."
at com.prosysopc.ua.client.UaClient.n(Unknown Source)
at com.prosysopc.ua.client.UaClient.connect(Unknown Source)
at *lineOfCode*
Caused by: org.opcfoundation.ua.common.ServiceResultException:
Bad_SecurityChecksFailed (0x80130000) "An error occurred verifying security."
at org.opcfoundation.ua.transport.tcp.io.TcpConnection$ReadThread.run(Unknown Source)
Mit dem lineOfCodeclient.connect()
zu sein.
Vielen Dank im Voraus für die Hilfe !!
Vielen Dank für Ihre Antwort! Ich verstehe, dass ich mit dem Zertifikat umgehen muss, das vom Server gesendet wird. Meine Frage war mehr _programmatisch_, da ich hier wirklich leer bin: Ich habe einen Validator gesetzt (siehe Code oben) und wenn ich die Zertifikate vor und nach 'client.connect()' über 'validator.getRejected/Reloved/TrustedCertificates überprüfe. length() 'Ich bekomme '0' als Antwort für alle drei Arten von Zertifikaten vor und nach der Verbindung. Sollte nicht mindestens eins im abgelehnten Verzeichnis sein? – Nanda
@Nanda Ich habe mehr Erfahrung mit dem .Net Base Case, aber ich würde einen ähnlichen Ansatz in Java erwarten. In Opc UA muss der Client dem Server vertrauen (Schritt 2 in meiner Antwort). Dies wird normalerweise dadurch erreicht, dass das Serverzertifikat an einem bestimmten Ort abgelegt wird. Dieser Ort muss Ihrer Anwendung bekannt gegeben werden, und hier müssen Sie (programmatisch) etwas unternehmen. Sie müssen herausfinden, wie Sie dem Validator mitteilen können, wo nach den (vertrauenswürdigen) Zertifikaten gesucht werden soll. Wenn der Validator diese Art von Eigenschaften nicht zur Verfügung stellt, müssen Sie das Vertrauen selbst irgendwie überprüfen, aber ich glaube das nicht. Ein – Thomas
Grund für mich zu glauben, dass der Validator ein TrustedCertifcates Attribut hat. Ich würde erwarten, dass die Anwendung den Inhalt eines Speichers in diese Variable zu einem bestimmten Zeitpunkt laden würde. Wenn Sie debuggen, wie diese "TrustedCertificates" -Variable initialisiert wird, sollten Sie einen Hinweis erhalten, wie dies zu tun ist. – Thomas