Server.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package at.acdp.opcur.opc;
  2. /*
  3. * Copyright (c) 2016 Kevin Herron
  4. *
  5. * All rights reserved. This program and the accompanying materials
  6. * are made available under the terms of the Eclipse Public License v1.0
  7. * and Eclipse Distribution License v1.0 which accompany this distribution.
  8. *
  9. * The Eclipse Public License is available at
  10. * http://www.eclipse.org/legal/epl-v10.html
  11. * and the Eclipse Distribution License is available at
  12. * http://www.eclipse.org/org/documents/edl-v10.html.
  13. */
  14. import java.io.File;
  15. import java.security.Security;
  16. import java.util.EnumSet;
  17. import java.util.List;
  18. import java.util.UUID;
  19. import java.util.concurrent.CompletableFuture;
  20. import com.google.common.collect.ImmutableList;
  21. import org.eclipse.milo.opcua.sdk.server.OpcUaServer;
  22. import org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig;
  23. import org.eclipse.milo.opcua.sdk.server.identity.CompositeValidator;
  24. import org.eclipse.milo.opcua.sdk.server.identity.UsernameIdentityValidator;
  25. import org.eclipse.milo.opcua.sdk.server.identity.X509IdentityValidator;
  26. import org.eclipse.milo.opcua.sdk.server.util.HostnameUtil;
  27. import org.eclipse.milo.opcua.stack.core.application.DefaultCertificateManager;
  28. import org.eclipse.milo.opcua.stack.core.application.DirectoryCertificateValidator;
  29. import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy;
  30. import org.eclipse.milo.opcua.stack.core.types.builtin.DateTime;
  31. import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText;
  32. import org.eclipse.milo.opcua.stack.core.types.structured.BuildInfo;
  33. import org.eclipse.milo.opcua.stack.core.util.CertificateUtil;
  34. import org.eclipse.milo.opcua.stack.core.util.CryptoRestrictions;
  35. import org.slf4j.LoggerFactory;
  36. import static com.google.common.collect.Lists.newArrayList;
  37. import static org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig.USER_TOKEN_POLICY_ANONYMOUS;
  38. import static org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig.USER_TOKEN_POLICY_USERNAME;
  39. import static org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig.USER_TOKEN_POLICY_X509;
  40. public class Server {
  41. static {
  42. CryptoRestrictions.remove();
  43. // Required for SecurityPolicy.Aes256_Sha256_RsaPss
  44. //Security.addProvider(new BouncyCastleProvider());
  45. }
  46. public static void main(String[] args) throws Exception {
  47. Server server = new Server();
  48. server.startup().get();
  49. final CompletableFuture<Void> future = new CompletableFuture<>();
  50. Runtime.getRuntime().addShutdownHook(new Thread(() -> future.complete(null)));
  51. future.get();
  52. }
  53. private final OpcUaServer server;
  54. public Server() throws Exception {
  55. File securityTempDir = new File(System.getProperty("java.io.tmpdir"), "security");
  56. if (!securityTempDir.exists() && !securityTempDir.mkdirs()) {
  57. throw new Exception("unable to create security temp dir: " + securityTempDir);
  58. }
  59. LoggerFactory.getLogger(getClass()).info("security temp dir: {}", securityTempDir.getAbsolutePath());
  60. KeyStoreLoader loader = new KeyStoreLoader().load(securityTempDir);
  61. DefaultCertificateManager certificateManager = new DefaultCertificateManager(
  62. loader.getServerKeyPair(),
  63. loader.getServerCertificateChain()
  64. );
  65. File pkiDir = securityTempDir.toPath().resolve("pki").toFile();
  66. DirectoryCertificateValidator certificateValidator = new DirectoryCertificateValidator(pkiDir);
  67. LoggerFactory.getLogger(getClass()).info("pki dir: {}", pkiDir.getAbsolutePath());
  68. UsernameIdentityValidator identityValidator = new UsernameIdentityValidator(
  69. true,
  70. authChallenge -> {
  71. String username = authChallenge.getUsername();
  72. String password = authChallenge.getPassword();
  73. boolean userOk = "user".equals(username) && "password1".equals(password);
  74. boolean adminOk = "admin".equals(username) && "password2".equals(password);
  75. return userOk || adminOk;
  76. }
  77. );
  78. X509IdentityValidator x509IdentityValidator = new X509IdentityValidator(c -> true);
  79. List<String> bindAddresses = newArrayList();
  80. bindAddresses.add("0.0.0.0");
  81. List<String> endpointAddresses = newArrayList();
  82. endpointAddresses.add(HostnameUtil.getHostname());
  83. endpointAddresses.addAll(HostnameUtil.getHostnames("0.0.0.0"));
  84. // The configured application URI must match the one in the certificate(s)
  85. String applicationUri = certificateManager.getCertificates().stream()
  86. .findFirst()
  87. .map(certificate ->
  88. CertificateUtil.getSubjectAltNameField(certificate, CertificateUtil.SUBJECT_ALT_NAME_URI)
  89. .map(Object::toString)
  90. .orElseThrow(() -> new RuntimeException("certificate is missing the application URI")))
  91. .orElse("urn:eclipse:milo:examples:server:" + UUID.randomUUID());
  92. OpcUaServerConfig serverConfig = OpcUaServerConfig.builder()
  93. .setApplicationUri(applicationUri)
  94. .setApplicationName(LocalizedText.english("Eclipse Milo OPC UA Example Server"))
  95. .setBindPort(12686)
  96. .setBindAddresses(bindAddresses)
  97. .setEndpointAddresses(endpointAddresses)
  98. .setBuildInfo(
  99. new BuildInfo(
  100. "urn:eclipse:milo:example-server",
  101. "eclipse",
  102. "eclipse milo example server",
  103. OpcUaServer.SDK_VERSION,
  104. "", DateTime.now()))
  105. .setCertificateManager(certificateManager)
  106. .setCertificateValidator(certificateValidator)
  107. .setIdentityValidator(new CompositeValidator(identityValidator, x509IdentityValidator))
  108. .setProductUri("urn:eclipse:milo:example-server")
  109. .setServerName("example")
  110. .setSecurityPolicies(
  111. EnumSet.of(
  112. SecurityPolicy.None,
  113. SecurityPolicy.Basic128Rsa15,
  114. SecurityPolicy.Basic256,
  115. SecurityPolicy.Basic256Sha256,
  116. SecurityPolicy.Aes128_Sha256_RsaOaep,
  117. SecurityPolicy.Aes256_Sha256_RsaPss))
  118. .setUserTokenPolicies(
  119. ImmutableList.of(
  120. USER_TOKEN_POLICY_ANONYMOUS,
  121. USER_TOKEN_POLICY_USERNAME,
  122. USER_TOKEN_POLICY_X509))
  123. .build();
  124. server = new OpcUaServer(serverConfig);
  125. server.getNamespaceManager().registerAndAdd(
  126. MyNamespace.NAMESPACE_URI,
  127. idx -> new MyNamespace(server, idx));
  128. }
  129. public OpcUaServer getServer() {
  130. return server;
  131. }
  132. public CompletableFuture<OpcUaServer> startup() {
  133. return server.startup();
  134. }
  135. public CompletableFuture<OpcUaServer> shutdown() {
  136. return server.shutdown();
  137. }
  138. }