Ich versuche, einen HTTPS -Server auf Android mit einem programmatisch generierten selbstsignierten Zertifikat aufzubauen. Ich fühle mich ziemlich nah, aber ich kann immer noch keine Verbindung zum HTTPS -Server herstellen. Wenn ich versuche, mit OpenSSL eine Verbindung zum Server herzustellen, erhalte ich Folgendes: < /p>
openssl s_client -connect 192.168.1.97:8888
CONNECTED(00000003)
2895:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:/SourceCache/OpenSSL098/OpenSSL098-50/src/ssl/s23_clnt.c:602:
< /code>
Der Code ist Folgendes: < /p>
public class HttpsHello {
private static String domainName = "localhost";
static {
Security.addProvider(new BouncyCastleProvider());
}
public static void test(String[] args) {
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair KPair = keyPairGenerator.generateKeyPair();
X509V3CertificateGenerator v3CertGen = new X509V3CertificateGenerator();
int ran = new SecureRandom().nextInt();
if (ran < 0) ran = ran * -1;
BigInteger serialNumber = BigInteger.valueOf(ran);
v3CertGen.setSerialNumber(serialNumber);
v3CertGen.setIssuerDN(new X509Principal("CN=" + domainName + ", OU=None, O=None L=None, C=None"));
v3CertGen.setNotBefore(new Date(System.currentTimeMillis() - 1000L * 60 * 60 * 24 * 30));
v3CertGen.setNotAfter(new Date(System.currentTimeMillis() + (1000L * 60 * 60 * 24 * 365 * 10)));
v3CertGen.setSubjectDN(new X509Principal("CN=" + domainName + ", OU=None, O=None L=None, C=None"));
v3CertGen.setPublicKey(KPair.getPublic());
// v3CertGen.setSignatureAlgorithm("MD5WithRSAEncryption");
v3CertGen.setSignatureAlgorithm("SHA1WithRSAEncryption");
X509Certificate pkcert = v3CertGen.generateX509Certificate(KPair.getPrivate());
// FileOutputStream fos = new FileOutputStream("/path/to/testCert.cert");
// fos.write(pkcert.getEncoded());
// fos.close();
ByteArrayInputStream cert = new ByteArrayInputStream(pkcert.getEncoded());
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null);
ks.setCertificateEntry("localhost", pkcert);
// ks.load(cert,null);
KeyManagerFactory kmf =
KeyManagerFactory.getInstance("X509");
kmf.init(ks, null);
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), null, null);
SSLServerSocketFactory ssf = sc.getServerSocketFactory();
SSLServerSocket s
= (SSLServerSocket) ssf.createServerSocket(8888);
s.setEnabledCipherSuites(s.getSupportedCipherSuites());
// s.setEnabledCipherSuites(new String[]{"SSL_DH_anon_WITH_RC4_128_MD5"});
// s.setEnabledCipherSuites(new String[]{"SHA1WithRSAEncryption"});
System.out.println("Server started:");
printServerSocketInfo(s);
// Listening to the port
SSLSocket c = (SSLSocket) s.accept();
printSocketInfo(c);
BufferedWriter w = new BufferedWriter(
new OutputStreamWriter(c.getOutputStream()));
BufferedReader r = new BufferedReader(
new InputStreamReader(c.getInputStream()));
String m = r.readLine();
w.write("HTTP/1.0 200 OK");
w.newLine();
w.write("Content-Type: text/html");
w.newLine();
w.newLine();
w.write("Hello world!");
w.newLine();
w.flush();
w.close();
r.close();
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void printSocketInfo(SSLSocket s) {
System.out.println("Socket class: " + s.getClass());
System.out.println(" Remote address = "
+ s.getInetAddress().toString());
System.out.println(" Remote port = " + s.getPort());
System.out.println(" Local socket address = "
+ s.getLocalSocketAddress().toString());
System.out.println(" Local address = "
+ s.getLocalAddress().toString());
System.out.println(" Local port = " + s.getLocalPort());
System.out.println(" Need client authentication = "
+ s.getNeedClientAuth());
SSLSession ss = s.getSession();
System.out.println(" Cipher suite = " + ss.getCipherSuite());
System.out.println(" Protocol = " + ss.getProtocol());
}
private static void printServerSocketInfo(SSLServerSocket s) {
System.out.println("Server socket class: " + s.getClass());
System.out.println(" Socker address = "
+ s.getInetAddress().toString());
System.out.println(" Socker port = "
+ s.getLocalPort());
System.out.println(" Need client authentication = "
+ s.getNeedClientAuth());
System.out.println(" Want client authentication = "
+ s.getWantClientAuth());
System.out.println(" Use client mode = "
+ s.getUseClientMode());
}
}
< /code>
Danke. 'T. Der einzige Keystore, der arbeitet, hat dort einen Eintrag für einen privatekeyEntry, in dem derjenige, der nicht arbeitet, eine vertrauenswürdige Certentry hat. Ich habe diesen Code dann geändert, um den Eintrag für den Alias "Localhost" auszudrucken, und unten habe ich das, was ich habe. Ich vermute, das Problem ist, dass es sich um einen vertrauenswürdigen Zertifikateintrag und kein privater Schlüsseleintrag handelt. Wie ändere ich das? < /p>
vertrauenswürdiger Zertifikateintrag:
[0] Version: 3
serialNumber: 752445443
issuerdn: cn = localhost, ou = none, O = keine l, c = none
Startdatum: Mo 26. Mai 09:17:01 CDT 2014
Enddatum: Sa 22. Juni 09:17:01 CDT 2024
Subjektdn: cn = localhost, ou = keine, o = keine l, c = keine
öffentlicher Schlüssel: RSA Public Key
Modul: B75870CD29DB79F8C015D440A27CC1E81C9DD829268EFA2CE48EFC596B3E9C6 0E1D1621E10ABA34472B6F7890B16392DB021C0358E665B1BF58A426FBC47E7C1 35da583e4cd6bb9c69668ee4ff1E05B1DE8E7F5FB5604044A1087AC0181BA09F6 1AB5345D9BE5D930889B7C328329D0D18CF53F4C5AF6BFF1F0E488744EA1FB
öffentlicher Exponent: 10001
Signaturalgorithmus: SHA1Withrsa
Signatur: 83DF0E761E9DF2E61D5354CA5837975E0D97FCD
5201F8904B695D7BDBE08C5DFDFB8BCD6447657C
19740797A6314B2547A45985166C11EBADC16C6
C24B8E1D3C5DE83EC1AC2C1C1092C3D06ED33408
4CF2811C5F9DBA8A9D3EF0DCB8FEF760E4D1D704
8FBB60EAG21ACCCCCIC2626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626fb /> 951901f8e16ab6cd < /p>
GetCiphersuite () gibt ssl_null_with_null_null zurück ⇐ Java
-
- Similar Topics
- Replies
- Views
- Last post