SSL cert

we use lots of ssh to access the web service or https. Sometime  to create the cerfication file named:

jssecacerts

Then we can just copy this file to  $java_home/lib/security

 

 

/**
 * http://blogs.sun.com/andreas/resource/InstallCert.java
 * Use:
 * java InstallCert hostname
 * Example:
 *% java InstallCert ecc.fedora.redhat.com
 */

import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 * Class used to add the server's certificate to the KeyStore
 * with your trusted certificates.
 */
public class InstallCert {

    public static void main(String[] args) throws Exception {
        String host;
        int port;
        char[] passphrase;
        if ((args.length == 1) || (args.length == 2)) {
            String[] c = args[0].split(":");
            host = c[0];
            port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
            String p = (args.length == 1) ? "changeit" : args[1];
            passphrase = p.toCharArray();
        } else {
            System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");
            return;
        }

        File file = new File("jssecacerts");
        if (file.isFile() == false) {
            char SEP = File.separatorChar;
            File dir = new File(System.getProperty("java.home") + SEP
                    + "lib" + SEP + "security");
            file = new File(dir, "jssecacerts");
            if (file.isFile() == false) {
                file = new File(dir, "cacerts");
            }
        }
        System.out.println("Loading KeyStore " + file + "...");
        InputStream in = new FileInputStream(file);
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(in, passphrase);
        in.close();

        SSLContext context = SSLContext.getInstance("TLS");
        TrustManagerFactory tmf =
                TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
        context.init(null, new TrustManager[]{tm}, null);
        SSLSocketFactory factory = context.getSocketFactory();

        System.out.println("Opening connection to " + host + ":" + port + "...");
        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
        socket.setSoTimeout(10000);
        try {
            System.out.println("Starting SSL handshake...");
            socket.startHandshake();
            socket.close();
            System.out.println();
            System.out.println("No errors, certificate is already trusted");
        } catch (SSLException e) {
            System.out.println();
            e.printStackTrace(System.out);
        }

        X509Certificate[] chain = tm.chain;
        if (chain == null) {
            System.out.println("Could not obtain server certificate chain");
            return;
        }

        BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in));

        System.out.println();
        System.out.println("Server sent " + chain.length + " certificate(s):");
        System.out.println();
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        for (int i = 0; i < chain.length; i++) {
            X509Certificate cert = chain[i];
            System.out.println
                    (" " + (i + 1) + " Subject " + cert.getSubjectDN());
            System.out.println("   Issuer  " + cert.getIssuerDN());
            sha1.update(cert.getEncoded());
            System.out.println("   sha1    " + toHexString(sha1.digest()));
            md5.update(cert.getEncoded());
            System.out.println("   md5     " + toHexString(md5.digest()));
            System.out.println();
        }

        System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
        String line = reader.readLine().trim();
        int k;
        try {
            k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
        } catch (NumberFormatException e) {
            System.out.println("KeyStore not changed");
            return;
        }

        X509Certificate cert = chain[k];
        String alias = host + "-" + (k + 1);
        ks.setCertificateEntry(alias, cert);

        OutputStream out = new FileOutputStream("jssecacerts");
        ks.store(out, passphrase);
        out.close();

        System.out.println();
        System.out.println(cert);
        System.out.println();
        System.out.println
                ("Added certificate to keystore 'jssecacerts' using alias '"
                        + alias + "'");
    }

    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

    private static String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 3);
        for (int b : bytes) {
            b &= 0xff;
            sb.append(HEXDIGITS[b >> 4]);
            sb.append(HEXDIGITS[b & 15]);
            sb.append(' ');
        }
        return sb.toString();
    }

    private static class SavingTrustManager implements X509TrustManager {

        private final X509TrustManager tm;
        private X509Certificate[] chain;

        SavingTrustManager(X509TrustManager tm) {
            this.tm = tm;
        }

        public X509Certificate[] getAcceptedIssuers() {
            throw new UnsupportedOperationException();
        }

        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            throw new UnsupportedOperationException();
        }

        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            this.chain = chain;
            tm.checkServerTrusted(chain, authType);
        }
    }

}

 

<think>嗯,用户遇到了存储fake SSL证书时出现权限被拒绝的问题,具体错误是“permission denied”在创建PEM证书文件时。我需要根据提供的引用内容来找出解决方法。首先,引用[1]和[2]提到无法创建或打开default-fake-certificate.pem文件,可能是因为目录或文件的权限问题。引用[3]和[4]指出需要检查证书的权限配置,并修改文件权限。引用[5]则提到可能是nginx-ingress版本的问题,需要更换版本。 我应该先建议用户检查目录和文件的权限,确保运行ingress-nginx的用户(比如www-data或nginx)有读写权限。可能需要使用chmod或chown命令修改权限。然后,检查SELinux或AppArmor是否阻止了访问,暂时禁用或调整策略。如果权限正确,但问题依旧,考虑手动生成证书并更新ingress配置。另外,用户提到替换nginx-ingress版本解决了问题,所以建议检查版本兼容性,必要时升级或回滚版本。最后,确认Pod是否以非root用户运行,如果是,可能需要调整安全上下文或挂载卷的权限。这些步骤应该能覆盖大部分可能的原因,帮助用户解决问题。</think>### 解决SSL证书权限问题的分步指南 #### 1. 检查目录和文件权限 错误提示显示无法创建或修改文件`/etc/ingress-controller/ssl/default-fake-certificate.pem`,通常由以下原因引起: - **目录权限不足**:确保目录`/etc/ingress-controller/ssl`的权限允许容器进程写入。 ```bash # 检查目录权限 ls -ld /etc/ingress-controller/ssl # 赋予读写执行权限(建议测试环境使用) sudo chmod 755 /etc/ingress-controller/ssl # 修改属主(假设容器进程用户为nginx) sudo chown -R nginx:nginx /etc/ingress-controller/ssl ``` - **文件权限冲突**:若文件已存在,可能权限配置错误: ```bash sudo chmod 644 /etc/ingress-controller/ssl/default-fake-certificate.pem ``` #### 2. 检查SELinux/AppArmor限制 若系统启用了强制访问控制(如SELinux或AppArmor),可能阻止容器写入目录: - **临时禁用SELinux**(仅用于测试): ```bash setenforce 0 ``` - **添加文件标签**(持久化修复): ```bash sudo chcon -Rt container_file_t /etc/ingress-controller/ssl ``` #### 3. 手动生成证书并挂载 通过预生成证书避免动态生成时的权限问题: 1. 生成自签名证书: ```bash openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout fake-ssl.key -out fake-ssl.crt \ -subj "/CN=default-fake-certificate" cat fake-ssl.key fake-ssl.crt > default-fake-certificate.pem ``` 2. 在Kubernetes部署中挂载证书: ```yaml volumes: - name: ssl-cert hostPath: path: /path/to/default-fake-certificate.pem volumeMounts: - name: ssl-cert mountPath: /etc/ingress-controller/ssl/ ``` #### 4. 调整容器安全上下文 若容器以非root用户运行(如UID 1000),需确保其有权限访问目录: ```yaml securityContext: runAsUser: 0 # 以root运行(不推荐长期使用) # 或通过fsGroup赋予组权限 fsGroup: 1000 ``` #### 5. 排查Ingress控制器版本问题 部分Rancher封装的nginx-ingress版本可能存在缺陷[^5],可尝试: ```bash # 查看当前ingress版本 kubectl describe pod <ingress-pod> | grep Image # 升级到官方稳定版本 helm upgrade ingress-nginx ingress-nginx/ingress-nginx --version 4.0.18 ``` ### 相关技术原理 - **权限模型**:Linux文件系统通过`user:group:other`三组权限控制访问,容器进程需匹配目录属主或属组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值