package com.qianwen.mdc.service.opcua; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.security.Key; import java.security.KeyPair; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.cert.Certificate; import java.security.cert.X509Certificate; import java.util.regex.Pattern; import org.eclipse.milo.opcua.sdk.server.util.HostnameUtil; import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateBuilder; import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class KeyStoreLoader { public KeyStoreLoader load(Path baseDir) throws Exception { KeyStore keyStore = KeyStore.getInstance("PKCS12"); Path serverKeyStore = baseDir.resolve("opcua-client.pfx"); this.logger.info("Loading KeyStore at {}", serverKeyStore); if (!Files.exists(serverKeyStore, new java.nio.file.LinkOption[0])) { keyStore.load(null, PASSWORD); KeyPair keyPair = SelfSignedCertificateGenerator.generateRsaKeyPair(2048); SelfSignedCertificateBuilder builder = (new SelfSignedCertificateBuilder(keyPair)).setCommonName("mdc").setOrganization("hx").setOrganizationalUnit("Kx").setLocalityName("Terran").setStateName("Shanghai").setCountryCode("CN").setApplicationUri("urn:eclipse:milo:examples:client").addDnsName("localhost").addIpAddress("127.0.0.1"); for (String hostname : HostnameUtil.getHostnames("0.0.0.0")) { if (IP_ADDR_PATTERN.matcher(hostname).matches()) { builder.addIpAddress(hostname); continue; } builder.addDnsName(hostname); } X509Certificate certificate = builder.build(); keyStore.setKeyEntry("hx-mdc", keyPair.getPrivate(), PASSWORD, (Certificate[])new X509Certificate[] { certificate }); try (OutputStream out = Files.newOutputStream(serverKeyStore, new java.nio.file.OpenOption[0])) { keyStore.store(out, PASSWORD); } } else { try (InputStream in = Files.newInputStream(serverKeyStore, new java.nio.file.OpenOption[0])) { keyStore.load(in, PASSWORD); } } Key serverPrivateKey = keyStore.getKey("hx-mdc", PASSWORD); if (serverPrivateKey instanceof PrivateKey) { this.clientCertificate = (X509Certificate)keyStore.getCertificate("hx-mdc"); PublicKey serverPublicKey = this.clientCertificate.getPublicKey(); this.clientKeyPair = new KeyPair(serverPublicKey, (PrivateKey)serverPrivateKey); } return this; } public X509Certificate getClientCertificate() { return this.clientCertificate; } public KeyPair getClientKeyPair() { return this.clientKeyPair; } private static final Pattern IP_ADDR_PATTERN = Pattern.compile("^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"); private static final String CLIENT_ALIAS = "hx-mdc"; private static final char[] PASSWORD = "12345678".toCharArray(); private final Logger logger = LoggerFactory.getLogger(getClass()); private X509Certificate clientCertificate; private KeyPair clientKeyPair; }