2014-03-04 2 views
3

SSL 암호화 연결 (암호화 만, 인증 없음)을 허용하고 나중에 강제 적용하도록 Oracle 12 인스턴스를 구성하려고합니다.Oracle 용 SSL 연결 구성 12

SSL With Oracle JDBC Thin Driver에 설명 된 것처럼 내가 한 :

LISTENER = 
    (DESCRIPTION_LIST = 
    (DESCRIPTION = 
     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) 
     (ADDRESS = (PROTOCOL = TCP)(HOST = myhost)(PORT = 1521)) 
     (ADDRESS = (PROTOCOL = TCPS)(HOST = myhost)(PORT = 2484)) 
    ) 
) 

WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/tmp/oracle_wallet_tmp))) 
SSL_CLIENT_AUTHENTICATION=FALSE 

LISTENER = 
    (DESCRIPTION_LIST = 
    (DESCRIPTION = 
     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) 
     (ADDRESS = (PROTOCOL = TCP)(HOST = myhost)(PORT = 1521)) 
    ) 
) 

에서

listener.ora의 변경도 SQLNET.ORA에 마지막 두 줄을 추가했다.

나는 다음

orapki wallet create -wallet /tmp/oracle_wallet_tmp -pwd test1234 

와 지갑을 생성하고

lsnrctl stop 
lsnrctl start 

비 암호화 세션이 여전히 잘 작동 리스너를 다시 시작됩니다. 그러나

그러나 암호화 된 연결에 JDBC를 통해 연결을 시도 할 때 나는

Exception in thread "main" java.sql.SQLRecoverableException: I/O-Fehler: Received fatal alert: handshake_failure 
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:682) 
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:711) 
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385) 
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30) 
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:558) 
    at java.sql.DriverManager.getConnection(DriverManager.java:571) 
    at java.sql.DriverManager.getConnection(DriverManager.java:187) 
    at orassl.Orassl.<init>(Orassl.java:23) 
    at orassl.Orassl.main(Orassl.java:38) 
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) 
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1959) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) 
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:702) 
    at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122) 
    at oracle.net.ns.Packet.send(Packet.java:419) 
    at oracle.net.ns.ConnectPacket.send(ConnectPacket.java:241) 
    at oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:151) 
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:263) 
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360) 
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486) 
    ... 8 more 

리스너 로그 파일 listener/alert/log.xml은 나에게

<msg time='2014-03-04T14:03:19.906+01:00' org_id='oracle' comp_id='tnslsnr' 
type='UNKNOWN' level='16' host_id='myhost' 
host_addr='hostip'> 
<txt>04-MAR-2014 14:03:19 * &lt;unknown connect data&gt; * 12561 
</txt> 
</msg> 
<msg time='2014-03-04T14:03:19.907+01:00' org_id='oracle' comp_id='tnslsnr' 
type='UNKNOWN' level='16' host_id='myhost' 
host_addr='hostip'> 
<txt>TNS-12561: TNS:unknown error 
</txt> 
</msg> 
<msg time='2014-03-04T14:03:19.933+01:00' org_id='oracle' comp_id='tnslsnr' 
type='UNKNOWN' level='16' host_id='myhost' 
host_addr='hostip'> 
<txt>04-MAR-2014 14:03:19 * &lt;unknown connect data&gt; * 12561 
</txt> 
</msg> 
<msg time='2014-03-04T14:03:19.933+01:00' org_id='oracle' comp_id='tnslsnr' 
type='UNKNOWN' level='16' host_id='myhost' 
host_addr='hostip'> 
<txt>TNS-12561: TNS:unknown error 
</txt> 
</msg> 
클라이언트는 다음과 같이 연결

을 알 수 :

props.setProperty("oracle.net.ssl_cipher_suites", "(SSL_DH_anon_WITH_3DES_EDE_CBC_SHA, SSL_DH_anon_WITH_RC4_128_MD5, SSL_DH_anon_WITH_DES_CBC_SHA)"); 
props.setProperty("user", "dbuser"); 
props.setProperty("password", "dbpass"); 
final Connection c= DriverManager.getConnection("jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=hostip)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=mysid)))", props); 

나는 아직도 뭐하는거야? 응?

+0

이것은 일반적인 오류입니다. 이 오류에 대한 자세한 정보를 얻으려면 추적을 사용하십시오. –

답변

1

두 가지 중요한 점은 내가, 당신이 표준에 확인을해야 더 이상 익명 DH 암호에 관한 withepaper의 댓글이 12C 유효하지 않습니다

  • (SQLDeveloper, SQLPLUS 명령으로 JDBC를) 작업 점점 SSL 발견 암호 - 내 경우에 서버 sqlnet.oralistner.oraSSL_CIPHER_SUITES을 주석 처리하는 것이 트릭을 만들었습니다.

  • 데이터베이스에서 local_listener 매개 변수를 SSL을 지원하는 값으로 명시 적으로 설정해야합니다. 간단하게 LISTENER 설정을 listener.ora에서 $ORACLE_HOME/network/admin/tnsnames.ora으로 복사 한 다음 local_listener을 해당 값으로 설정할 수 있습니다 (예 : alter system set local_listener='LISTENER';

  • AES 암호 자바와 상자 밖으로 작동하지 않는 256 비트 - 당신은 "당신이 메타 링크에 액세스 할 수있는 경우 Java 암호화 확장 기능 (JCE)는

, 762286.1를 참고 설치해야 Oracle의 JDBC THIN 드라이버 (Doc ID 762286.1)에서 SSL을 사용하는 예 "가 도움이 될 수 있습니다.

힌트 : XML은 읽기가 어려워지기 때문에 추적 하위 디렉토리의 일반 텍스트 로그 파일을 검사 할 수 있습니다. 예 : /u01/app/diag/tnslsnr/$HOST/listener/trace/listener.log.

+0

불행히도 도움이되지 않습니다. 이미 주석 처리 된 SSL_CIPHER_SUITES이 (가) 있습니다. JCE를 설치해도 문제가 해결되지 않습니다. java 어플리케이션으로부터 연결을하고 있기 때문에'local_listener'는 여기에 적용되지 않습니다. 그래서 아직 해결책은 없습니다 ... – radlan

+0

local_listener는 리스너가 데이터베이스 연결을 리다이렉트하므로 사용자에게 계속 적용됩니다. 기본값으로 $ HOSTIP : 1521을 수신하면 명시 적으로 데이터베이스에 설정해야합니다. 그래서 청결하고 새로운 SSL 포트를 사용하여 리스너를 설정하면 데이터베이스는 그것에 대해 아무 것도 모릅니다. 필자의 경우 listener.log에서 연결을 볼 수 있었지만 데이터베이스가이 연결을 인식하지 못했기 때문에 연결이 전용 데이터베이스 프로세스에 다시 연결되지 않았습니다. 그래서 local_listener를 설정하면 적어도 저를 위해 문제가 해결되었습니다. – jmk

+0

그래서, 지금 시도했습니다. tnsnames.ora를 편집하고'(ADDRESS = (PROTOCOL = TCPS) (HOST = myhost) (PORT = 2484))'를 리스너가 정의한 리스너에게 추가했습니다. 그런 다음'alter system set local_listener = 'MY_LISTENER'를 수행했습니다. 하지만 아무 것도 바뀌지 않았습니다. 사실이 local_listener가 사용되는 것을 실제로 이해하지 못합니다. – radlan