0

我的问题链接到这个主题Calling Java from PLSQL 导致 oracle.aurora.vm.ReadOnlyObjectException

突然之间,从今天开始,当从 PLSQL 执行 Java 代码时,我们的生产中出现错误,请注意,我们有时会遇到此错误,不知道为什么,过去通过删除所有类并重新加载它们解决了这个问题但这次不是:

Oracle Database 12c 企业版 12.1.0.2.0 - 64 位生产

java.version = 1.6.0_71

sonic_Client = 8.6.0

PROCEDURE LOG_AND_SEND_TO_QUEUE_PR(
    msg                                             VARCHAR2,
    clientID                                        VARCHAR2,
    typeMessage                                     VARCHAR2,
    providerUrl                                     VARCHAR2,
    destination                                     VARCHAR2,
    usr                                             VARCHAR2,
    pwd                                             VARCHAR2,
    isTopic                                         VARCHAR2,
    ENABLED_HTTPS_ALGORITHM VARCHAR2 )
AS
  LANGUAGE JAVA NAME 'jms.cxmessenger.SonicSender.doSend(java.lang.String, java.lang.String,java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)';

jms.cxmessenger.SecureTrustManager 由 SonicMQ 客户端使用的系统属性设置。

package jms.cxmessenger;

import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.List;
import java.util.NoSuchElementException;

import javax.naming.InvalidNameException;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.ldap.LdapName;
import javax.naming.ldap.Rdn;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;

public class SecureTrustManager implements X509TrustManager {
    private static final X509Certificate[] EMPTY_X509CERTIFICATE_ARRAY = new X509Certificate[0];
    private CustomDefaultHostnameVerifier verifier = new CustomDefaultHostnameVerifier();

    private TrustManager[] trustManagers;

    {
        try {
            TrustManagerFactory trustManagerFactory = TrustManagerFactory
                    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init((KeyStore) null);
            trustManagers = trustManagerFactory.getTrustManagers();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public void check(X509Certificate[] chain, String authType) throws CertificateException {
        boolean trusted = false;
        if (chain.length > 0) {
            for (TrustManager trustManager : trustManagers) {
                try {
                    if (trustManager instanceof X509TrustManager) {
    /* line 43 */       ((X509TrustManager) trustManager).checkServerTrusted(chain, authType);//line 43
                        trusted = true;
                    }
                } catch (CertificateException e) {
                }
            }
        }
        if (!trusted && !Boolean.getBoolean("DEACTIVATE_HOSTNAME_VALIDATION")) {
            checkCN(chain);
        }
    }

    public X509Certificate[] getValidCertificates(X509Certificate[] chain, String peerHost) {
        return verifier.getValidCertificates(chain, peerHost);
    }

    private void checkCN(X509Certificate[] chains) throws CertificateException {
        if (Boolean.getBoolean("DEBUG")) {
            System.out.println("checkCN(X509Certificate[] chains) : " + Arrays.toString(chains));
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < chains.length; i++) {
            String cn = extractCN(chains[i].getIssuerX500Principal().getName());
            if (cn == null) {
                sb.append("\n\tFailed to authenticate Server CA : Name = "
                        + chains[i].getIssuerX500Principal().getName());
            } else {
                return;
            }
        }
        if (Boolean.getBoolean("DEBUG")) {
            System.out.println("sb.toString : " + sb.toString());
        }
        throw new CertificateException(sb.toString());
    }

    private String extractCN(final String subjectPrincipal) {
        if (subjectPrincipal == null) {
            return null;
        }
        try {
            final LdapName subjectDN = new LdapName(subjectPrincipal);
            final List<Rdn> rdns = subjectDN.getRdns();
            for (int i = rdns.size() - 1; i >= 0; i--) {
                final Rdn rds = rdns.get(i);
                final Attributes attributes = rds.toAttributes();
                final Attribute cn = attributes.get("cn");
                if (cn != null) {
                    try {
                        final Object value = cn.get();
                        if (value != null) {
                            return value.toString();
                        }
                    } catch (final NoSuchElementException ignore) {
                    } catch (final NamingException ignore) {
                    }
                }
            }
        } catch (final InvalidNameException e) {
        }
        return null;
    }

    @Override
    public void checkClientTrusted(X509Certificate[] certificates, String paramString) throws CertificateException {
        for (X509Certificate certificate : certificates) {
            certificate.checkValidity();
        }
        check(certificates, paramString);
    }

    @Override
    public void checkServerTrusted(X509Certificate[] certificates, String paramString) throws CertificateException {
        for (X509Certificate certificate : certificates) {
            certificate.checkValidity();
        }
        check(certificates, paramString);
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return trustManagers != null && trustManagers.length > 0 && trustManagers[0] instanceof X509TrustManager
                ? ((X509TrustManager) trustManagers[0]).getAcceptedIssuers() : EMPTY_X509CERTIFICATE_ARRAY;
    }

}

javax.net.ssl.SSLException:oracle.aurora.vm.ReadOnlyObjectException 在 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java) 在 com.sun.net.ssl .internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java) 在 jms.cxmessenger.JSSESSLImpl.createSSLSocket(JSSESSLImpl.java) 在 jms.cxmessenger.JSSESSLImpl.createSSLSocket(JSSESSLImpl. java:69) 在progress.message.net.ssl.ProgressSslSocket.(ProgressSslSocket.java) 在progress.message.net.ssl.ProgressSslSocket.(ProgressSslSocket.java:163) 在progress.message.net.ssl.ProgressSslSocketFactory。createProgressSocket(ProgressSslSocketFactory.java:172) 在progress.message.net.ProgressSocketFactory.createProgressSocket(ProgressSocketFactory.java:180) 在progress.message.zclient.Connection.openSocket(Connection.java:3660) 在progress.message.zclient.Connection .connectWithRecoveryOpt(Connection.java) 在progress.message.zclient.ReconnectHelper.connectAndChaseSingleFailoverRedirect(ReconnectHelper.java:534) 在progress.message.zclient.ReconnectHelper.connect(ReconnectHelper.java) 在progress.message.zclient.Connection.connect( Connection.java:1585) 在 progress.message.jimpl.Connection.(Connection.java:886) 在 progress.message.jclient.ConnectionFactory.createConnection(ConnectionFactory.java:2316) 在 jms.cxmessenger.SonicSender.doSend(SonicSender.爪哇:73)ProgressSocketFactory.createProgressSocket(ProgressSocketFactory.java:180) 在progress.message.zclient.Connection.openSocket(Connection.java:3660) 在progress.message.zclient.Connection.connectWithRecoveryOpt(Connection.java) 在progress.message.zclient.ReconnectHelper .connectAndChaseSingleFailoverRedirect(ReconnectHelper.java:534) 在progress.message.zclient.ReconnectHelper.connect(ReconnectHelper.java) 在progress.message.zclient.Connection.connect(Connection.java:1585) 在progress.message.jimpl.Connection。 (Connection.java:886) 在 jms.cxmessenger.SonicSender.doSend(SonicSender.java:73) 的 progress.message.jclient.ConnectionFactory.createConnection(ConnectionFactory.java:2316)ProgressSocketFactory.createProgressSocket(ProgressSocketFactory.java:180) 在progress.message.zclient.Connection.openSocket(Connection.java:3660) 在progress.message.zclient.Connection.connectWithRecoveryOpt(Connection.java) 在progress.message.zclient.ReconnectHelper .connectAndChaseSingleFailoverRedirect(ReconnectHelper.java:534) 在progress.message.zclient.ReconnectHelper.connect(ReconnectHelper.java) 在progress.message.zclient.Connection.connect(Connection.java:1585) 在progress.message.jimpl.Connection。 (Connection.java:886) 在 jms.cxmessenger.SonicSender.doSend(SonicSender.java:73) 的 progress.message.jclient.ConnectionFactory.createConnection(ConnectionFactory.java:2316)message.zclient.Connection.connectWithRecoveryOpt(Connection.java) 在progress.message.zclient.ReconnectHelper.connectAndChaseSingleFailoverRedirect(ReconnectHelper.java:534) 在progress.message.zclient.ReconnectHelper.connect(ReconnectHelper.java) 在progress.message.zclient .Connection.connect(Connection.java:1585) 在 progress.message.jimpl.Connection.(Connection.java:886) 在 progress.message.jclient.ConnectionFactory.createConnection(ConnectionFactory.java:2316) 在 jms.cxmessenger.SonicSender .doSend(SonicSender.java:73)message.zclient.Connection.connectWithRecoveryOpt(Connection.java) 在progress.message.zclient.ReconnectHelper.connectAndChaseSingleFailoverRedirect(ReconnectHelper.java:534) 在progress.message.zclient.ReconnectHelper.connect(ReconnectHelper.java) 在progress.message.zclient .Connection.connect(Connection.java:1585) 在 progress.message.jimpl.Connection.(Connection.java:886) 在 progress.message.jclient.ConnectionFactory.createConnection(ConnectionFactory.java:2316) 在 jms.cxmessenger.SonicSender .doSend(SonicSender.java:73)在 progress.message.jclient.ConnectionFactory.createConnection(ConnectionFactory.java:2316) 在 jms.cxmessenger.SonicSender.doSend( SonicSender.java:73)在 progress.message.jclient.ConnectionFactory.createConnection(ConnectionFactory.java:2316) 在 jms.cxmessenger.SonicSender.doSend( SonicSender.java:73)

原因:com.sun.net.ssl.internal.ssl 的 jms.cxmessenger.SecureTrustManager.checkServerTrusted(SecureTrustManager.java) 的 jms.cxmessenger.SecureTrustManager.check(SecureTrustManager.java:43) 的 oracle.aurora.vm.ReadOnlyObjectException .ClientHandshaker.serverCertificate(ClientHandshaker.java) 在 com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java) 在 com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java ) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java) 在 com.sun.net 的 com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java)。 ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java) ... 还有 16 个

有人可以帮忙吗

4

2 回答 2

0

你确定你有正确的jar版本吗?我不会期望jms.cxmessenger.*直到 cx messenger 或 sonic 2015(不确定)。cxmessenger 是最新版本。

于 2017-05-04T09:10:12.380 回答
0

问题是缺少一些 SYS Java 类!

公共同义词在那里,但后面没有类。

解决方案是重新安装 SYS Java 类,一切顺利!

于 2017-05-17T13:09:33.757 回答