java ssl bouncycastle sslengine

java - crea una instancia de SSLContext con un proveedor de Bouncy Castle



bouncycastle sslengine (2)

Estoy atrapado en la creación de un SSLContext (que quiero usar para crear una instancia de SSLEngine para manejar el transporte encriptado a través de java-nio):

El código

String protocol = "TLSv1.2"; Provider provider = new BouncyCastleProvider(); Security.addProvider(provider); sslContext = SSLContext.getInstance(protocol,provider.getName());

arroja la siguiente excepción:

Exception in thread "main" java.lang.RuntimeException: java.security.NoSuchAlgorithmException: no such algorithm: SSL for provider BC at org.bitmash.network.tcp.ssl.SslTransferFactory.<init>(SslTransferFactory.java:43) at org.bitmash.network.http.HttpsServer.<init>(HttpsServer.java:19)

Adjunté el paquete de proveedor actual de Bouncy Castle ''bcprov-jdk15on-150.jar'' (que obtuve de aquí ) al classpath de las aplicaciones así como a su bootclasspath (a través de VM-Option -Xbootclasspath / p), pero ninguno resolvió el problema. También probé diferentes valores para el protocol (es decir, ''SSL'' y ''TLSv1'') sin ningún efecto.

Además, encontré personas con problemas similares aquí y aquí . Pero a diferencia de ellos, estoy apuntando (y estoy usando) Java 7 (o superior), pero todavía tengo este problema. ¿Es -en general- incluso factible usar Bouncy Castle de esta manera, o tengo que volver a escribir mi protocolo usando su API respectiva en lugar del NIO de Oracle a través de SSLEngine (que es la forma en que lo estoy haciendo ahora mismo)?

Muchas gracias por cualquier ayuda aquí.


Sé que esta es una vieja pregunta, pero necesitaba una respuesta (así que estoy creando una):

  • [¿Es posible] crear una instancia de SSLContext con un proveedor de Bouncy Castle [?]
  • No

Por qué no?

Depurando esta línea de código:

Provider [] providers = Security.getProviders();

  • la versión 1.7 de SunJSSE predeterminada implementa los siguientes valores SSLContext:

    Alg.Alias.SSLContext.SSL = TLSv1
    Alg.Alias.SSLContext.SSLv3 = TLSv1
    SSLContext.Default = sun.security.ssl.SSLContextImpl $ DefaultSSLContext
    SSLContext.TLSv1 = sun.security.ssl.SSLContextImpl $ TLS10Context
    SSLContext.TLSv1.1 = sun.security.ssl.SSLContextImpl $ TLS11Context
    SSLContext.TLSv1.2 = sun.security.ssl.SSLContextImpl $ TLS12Context

  • utilizando bcprov-jdk15on-152.jar y agregando un nuevo BouncyCastleProvider () a la Seguridad, se puede observar que no hay valores SSLContext disponibles.

Esto debería tener sentido ya que Bouncy Castle es una implementación de JCE , no una implementación de JSSE .


Bouncy Castle realmente proporciona una implementación de JSSE a partir de la versión 1.56. Solo asegúrese de configurarlo con una prioridad más alta en java.security :

security.provider.1=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider ... security.provider.6=com.sun.net.ssl.internal.ssl.Provider

Puede usarlo luego con la API estándar:

SSLContext context = SSLContext.getInstance("TLS");