当前位置: 首页 > 知识库问答 >
问题:

SEC\u E\u无效\u令牌(0x80090308)-Jetty HTTPS servlet

东方夕
2023-03-14

我试图解决我的Jetty servlet在HTTPS上运行的问题。

这是浏览器中的错误:

这是卷曲中的错误:

我所做的:

>

  • 我创建了密钥库和信任库,如下所述:如何生成密钥库和信任库,以及https://serverfault.com/questions/488003/keytool-subjectalternativename

    这是我创建密钥库和信任库的批处理脚本:

    keytool -keystore keystore.jks -storepass P4ssW0rd -keypass P4ssW0rd -genkey -alias example -validity 365 -dname "CN=example,OU=Example,O=Example,L=Bratislava,ST=Slovakia,C=SK" -ext "SAN=DNS:example.com,DNS:www.example.com,DNS:test.example.com"
    "C:\Program Files\Git\usr\bin\openssl.exe" req -new -x509 -subj "/C=SK/ST=Slovakia/L=Bratislava/O=Example/OU=Example/CN=Root-CA" -keyout ca-key -out ca-cert -days 365 -passout pass:P4ssW0rd
    keytool -keystore truststore.jks -storepass P4ssW0rd -import -alias ca-root -file ca-cert -noprompt
    keytool -keystore keystore.jks -storepass P4ssW0rd -certreq -alias exmaple -file cert-file
    echo [SAN] > extFile
    echo subjectAltName=DNS:example.com,DNS:www.example.com,DNS:test.example.com >> extFile
    "C:\Program Files\Git\usr\bin\openssl.exe" x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out test.pem -days 365 -CAcreateserial -passin pass:P4ssW0rd -extensions SAN -extfile extFile
    keytool -keystore keystore.jks -storepass P4ssW0rd -import -alias ca-root -file ca-cert -noprompt
    keytool -keystore keystore.jks -storepass P4ssW0rd -import -alias metahost -file test.pem
    pause
    
    package sk.cood.metahost.server;
    
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import org.eclipse.jetty.server.*;
    import org.eclipse.jetty.servlet.ServletContextHandler;
    import org.eclipse.jetty.servlet.ServletHolder;
    import org.eclipse.jetty.util.ssl.SslContextFactory;
    
    import java.io.*;
    
    @WebServlet(displayName = "MetaHostServlet", urlPatterns = { "/*" })
    public class MetaHostServlet extends HttpServlet {
        private static File keyStoreFile;
        private static File trustStoreFile;
    
        public static void main(String[] args) throws Exception {
            loadKeyStores();
    
            Server server = new Server(443);
            ServerConnector connector = createSSLConnector(server, "P4ssW0rd", "P4ssW0rd", false);
            server.addConnector(connector);
    
            ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
            context.addServlet(new ServletHolder(new MetaHostServlet()),"/*");
            context.setContextPath("/");
            server.setHandler(context);
    
            server.start();
            server.join();
        }
    
        private static void loadKeyStores() {
            keyStoreFile = new File("keystore.jks");
            trustStoreFile = new File("truststore.jks");
            if (!keyStoreFile.exists()) {
                throw new RuntimeException("Key store file does not exist on path '"+keyStoreFile.getAbsolutePath()+"'");
            }
            if (!trustStoreFile.exists()) {
                throw new RuntimeException("Trust store file does not exist on path '"+trustStoreFile.getAbsolutePath()+"'");
            }
        }
    
        private static ServerConnector createSSLConnector(Server server, String keyStorePassword, String trustStorePassword, boolean isClientAuthNeeded) {
            SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
            sslContextFactory.setKeyStorePath(keyStoreFile.getAbsolutePath());
            sslContextFactory.setKeyStorePassword(keyStorePassword);
            sslContextFactory.setTrustStorePath(trustStoreFile.getAbsolutePath());
            sslContextFactory.setTrustStorePassword(trustStorePassword);
            sslContextFactory.setNeedClientAuth(isClientAuthNeeded);
    
            HttpConfiguration https_config = new HttpConfiguration();
            https_config.setSendServerVersion(false);
            https_config.setRequestHeaderSize(512 * 1024);
            https_config.setResponseHeaderSize(512 * 1024);
    
            SecureRequestCustomizer src = new SecureRequestCustomizer();
            https_config.addCustomizer(src);
    
            return new ServerConnector(server, sslContextFactory, new HttpConnectionFactory(https_config));
        }
    
        @Override
        public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
            res.setContentType("text/html");
            res.setStatus(HttpServletResponse.SC_OK);
            res.getWriter().println("<h1>Hello World!</h1>");
            res.getWriter().println("session=" + req.getSession(true).getId());
        }
    }
    

    我不知道我的情况有什么问题,也许在码头和证书方面更有经验的人会有所帮助。

    非常感谢你!

  • 共有1个答案

    葛泳
    2023-03-14

    您的ServerConnector不会对SSL执行任何操作,至少不会直接执行。

    这一行。。。

    return new ServerConnector(server, sslContextFactory, 
        new HttpConnectionFactory(https_config));
    

    它只支持HTTP/1.1普通明文,不支持SSL,并依赖JVM服务加载器根据您的SslContextFactory查找适当的SslConnectionFactory。服务器。

    由于您没有指定您的环境的类加载器/类路径是什么,也没有指定Jetty的特定版本,我鼓励您更直接地使用您的ServerConnector和您的SSL/TLS愿望,如果没有必要,请不要依赖ServiceLoader

    像这样...

    return new ServerConnector(server, 
        new SslConnectionFactory(slContextFactory, "http/1.1"),
        new HttpConnectionFactory(https_config));
    

    这可能会改善你的情况,但如果没有更多的细节,我无法确切地告诉你发生了什么或如何修复它。

     类似资料:
    • 定义的新集成密钥9xxx7e null 但仍然得到401的回应内容:

    • 我使用PuTTY密钥生成器生成了一个4096位RSA-2密钥,其中包含一个密码短语。 我保存了. ppk和一个openSSL格式的公钥。油灰格式公钥不起作用。 无论如何,我的错误如下: 有什么问题吗? 我使用Pageant来加载密钥,我使用Git Bash来尝试ssh连接。我也把密钥加载到GitHub,不知道我做错了什么。 我尝试在GitHub中添加新行,但没有添加新行

    • 我按照谷歌提供的留档使用API访问gmail。根据谷歌留档,我们需要访问令牌来管理gmail。 因此,我试图通过阅读下面给出的文档链接来创建一个访问令牌。 Link1:-developers.google.com/accounts/docs/OAuth2WebServer,基于此文档创建了URL1。 Link2:-code.google.com/p/google-mail-oauth2-tools

    • 我正在尝试理解OpenSSL中使用的x86汇编函数,以使用CPU的RDRAND指令获取随机字节。这是函数体: 我不知道cmp和cmobile指令的用途。我不是x86汇编程序员,但从我看过的参考文献中可以看出,我对它的作用的理解是: 因此,如果rdrand失败,rax只能为0(进位标志是明确的),并且只有当1)rdrand成功(进位设置)并在rax中放入非零数字,或2)ecx中的重试计数器已减为0时

    • 尝试在包含以下组件的Web应用程序中实现OpenId连接 身份提供者 身份提供程序和资源服务器是同一个应用程序。 SPA使用Password Flow获取并存储到cookie中。将存储到cookie中具有安全线程,但情况不同。 问题 IdP发布的access_token在30分钟后过期,SPA需要更新令牌,而无需再次询问用户凭据。 解决方案 IdP返回刷新令牌以及访问令牌。每当SPA从资源服务器获

    • 我正在构建ASP。NET Core WebAPI应用程序,并试图向我的应用程序提供令牌身份验证: API代码受[Authorize(Authorize(AuthenticationSchemes=“Bearer”)]保护。当我使用任何令牌发送请求时,我总是收到401。问题是,我关闭了所有令牌验证,但它没有帮助。 《邮递员》里有一张请求的照片 响应主体为空。响应标题(如果无法加载图像): HTTP/