Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure复合环和https_Https_Clojure_Ring_Compojure - Fatal编程技术网

Clojure复合环和https

Clojure复合环和https,https,clojure,ring,compojure,Https,Clojure,Ring,Compojure,我正在使用Clojure(ring和compojure)构建一个web应用程序,我不知道从哪里开始使用https。我有一个注册和登录,将需要安全,然后一旦他们的身份验证,他们将需要留在https 我似乎找不到一个关于一般设置https或专门为clojure应用设置https的好教程 我找到了这个答案: 这是否意味着我可以编写我的compojure应用程序,就好像没有https一样,让nginx坐在前面为我处理所有这些事情?是的,标准程序是让nginx在基于环的Web应用程序前面充当一个代理。这被

我正在使用Clojure(ring和compojure)构建一个web应用程序,我不知道从哪里开始使用https。我有一个注册和登录,将需要安全,然后一旦他们的身份验证,他们将需要留在https

我似乎找不到一个关于一般设置https或专门为clojure应用设置https的好教程

我找到了这个答案:


这是否意味着我可以编写我的compojure应用程序,就好像没有https一样,让nginx坐在前面为我处理所有这些事情?

是的,标准程序是让nginx在基于环的Web应用程序前面充当一个代理。这被认为是安全的,更容易维护,因为它更标准。我所知道的每一个应用程序都是这样做的。

通常应用程序级代码并不关心它是HTTPS还是HTTP。它通常由应用服务器或其前面的代理提供。如果您熟悉,那么您的选择与Java世界中的选择几乎相同

  • 如果您正在使用Jetty适配器,它有
    ssl?
    ssl端口
    选项。见和

  • 您可以在纯HTTP中运行Ring应用程序,并在其前面放置一个代理,如Nginx或Apache。代理将实现HTTPS并将请求作为普通HTTP转发到您的应用程序


  • 反向代理方法似乎是最常见的选择。然而,作为一个“实验”,我研究了如何在https中使用just ring、jetty compojure等。没那么难

  • 首先,您需要使用keytool生成一个自签名证书,并将其安装到一个新的密钥库中。keytool记录了一个非常好的过程,可以引导您完成这个过程。请注意,如果使用自签名证书,则需要在大多数浏览器中添加一个例外规则,表明您信任该证书

  • 将创建的密钥库文件复制到项目树的根目录中

  • 更新jetty配置参数以指定ssl、ssl端口、密钥库文件和密钥库密码

  • 将环/环默认值包添加到project.clj

  • 添加带有安全站点默认配置选项的wrap defaults中间件,以强制https连接,即将http连接重定向到https

  • 这不是我推荐用于生产的设置,但我发现它比在进行开发等工作时还必须配置ngix更简单。最困难的部分是通过keytool流程工作。然而,只要遵循文档和示例就足够了,只要你不让自己被所有选项所压倒——只要保持简单即可

    差不多

    keytool -genkeypair \
            -keystore $SSL_DIR/$KS_NAME \
            -keypass $PASSWORD \
            -storepass $PASSWORD \
            -keyalg RSA -keysize 2048 \
            -alias root \
            -ext bc:c \
            -dname "$ROOT_CN"
    
    echo "CA Key"
    keytool -genkeypair \
            -keystore $SSL_DIR/$KS_NAME \
            -alias ca \
            -ext bc:c \
            -keypass $PASSWORD \
            -keyalg RSA -keysize 2048 \
            -storepass $PASSWORD \
            -dname "$CA_CN"
    
    echo "Server Key"
    keytool -genkeypair \
            -keystore $SSL_DIR/$KS_NAME \
            -alias server \
            -keypass $PASSWORD \
            -storepass $PASSWORD \
            -keyalg RSA -keysize 2048 \
            -dname "$SERVER_CN"
    
    echo "Root Cert"
    keytool -keystore $SSL_DIR/$KS_NAME \
            -storepass $PASSWORD \
            -alias root \
            -exportcert \
            -rfc > $SSL_DIR/root.pem
    
    echo "CA Cert"
    keytool -storepass $PASSWORD \
            -keystore $SSL_DIR/$KS_NAME \
            -certreq \
            -alias ca | keytool -storepass $PASSWORD \
                                -keystore $SSL_DIR/$KS_NAME \
                                -gencert \
                                -alias root \
                                -ext BC=0 \
                                -rfc > $SSL_DIR/ca.pem
    
    echo "Import CA cert"
    keytool -keystore $SSL_DIR/$KS_NAME \
            -storepass $PASSWORD \
            -importcert \
            -alias ca \
            -file $SSL_DIR/ca.pem
    
    echo "Server Cert"
    keytool -storepass $PASSWORD \
            -keystore $SSL_DIR/$KS_NAME \
            -certreq \
            -alias server | keytool -storepass $PASSWORD \
                                    -keystore $SSL_DIR/$KS_NAME \
                                    -gencert \
                                    -alias ca \
                                    -rfc > $SSL_DIR/server.pem
    
    
    
    echo "Import Server Cert"
    cat $SSL_DIR/root.pem $SSL_DIR/ca.pem $SSL_DIR/server.pem | \
        keytool -keystore $SSL_DIR/$KS_NAME \
                -storepass $PASSWORD \
                -keypass $PASSWORD \
                -importcert \
                -alias server
    

    另一个解决方案是尝试nginx clojure(),通过它您可以直接在nginx上部署环应用程序。nginx可以更高效地完成https任务

    下面是一个关于nginx.conf的示例

    http{
    ###jvm动态库路径
    jvm_path'/usr/lib/jvm/java-7-oracle/jre/lib/amd64/server/libjvm.so';
    ###我的应用程序jar,例如clojure-1.5.1.jar、groovy-2.3.4.jar等。
    jvm_var my_other_jars'my_jar_dir/clojure-1.5.1.jar';
    ###我的应用程序类路径,windows用户应使用“;”作为分隔符
    jvm_options“-Djava.class.path=jars/nginx-clojure-0.3.0.jar:#{my_other_jars}”;
    服务器{
    倾听80个默认延迟;
    server_name example.com;
    ###重定向到https
    重写^/(.+)https://example.com/1美元永久性;
    }
    服务器{
    听443ssl;
    server_name example.com;
    ssl_证书/opt/mycert/my-unified.crt;
    ssl_证书_密钥/opt/mycert/my.key;
    位置/myapp{
    内容处理程序名称“my/ringapp”;
    }
    }
    }
    

    您可以从

    获得有关SSL服务器配置的更多详细信息,这非常简单。如果要在web应用程序中启用HTTPS支持,只需执行以下操作:

  • 使用名为keytool的linux工具生成Java密钥库(.jks)文件

  • 在project.clj文件的环映射中,添加以下内容:

    { :ssl?是吗 :ssl端口8443 :keystore“jks文件的路径” :key password“密钥库密码” }

  • 启动服务器。现在您的web应用已启用HTTPS


  • 我在尝试使用社交媒体代码测试登录时遇到了类似的问题,很明显,社交媒体代码必须通过HTTPS进行身份验证,这为我解决了问题。

    您可以设置环形中间件,强制所有请求使用SSL。一个简单的方法是使用库

    从环默认值文档:

    中间件包括四种配置
    -api默认值
    -站点默认值
    -安全api默认值
    -安全站点默认值

    “安全”默认值强制SSL。未加密的HTTP URL被重定向到等效的HTTPS URL,并发送各种标题和标志,以防止浏览器通过不安全的通道发送敏感信息

    另请注意:

    • 为了在不使用SSL的情况下启用本地开发,可以基于环境变量设置使用的环默认值。这很有帮助
    • 为了使SSL能够在负载平衡器或代理之后工作,必须在环默认值映射中将:proxy设置为true
    以下是总体思路:

    (ns my-app
      (:require [ring.middleware.defaults :refer :all]
                [environ.core :refer [env]]))
    
    (defroutes app-routes
      (GET "/" [] "home page"))
    
    (def app
      (-> app-routes
        (wrap-defaults (if (= (env :environment) "dev")
                         site-defaults
                         (assoc secure-site-defaults :proxy true))))
    
    我不知道nginx,但我已经为部署到Heroku的应用程序开发了它