首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure Compojure Ring和https

Clojure Compojure Ring和https
EN

Stack Overflow用户
提问于 2014-07-23 04:18:10
回答 5查看 4.1K关注 0票数 6

我正在使用Clojure (ring和compojure)来构建一个web应用程序,但我不知道从哪里开始使用https。我有一个注册和登录,将需要保护,然后一旦他们通过认证,他们将需要留在https。

我似乎找不到一个好的教程来设置一般的https或者专门针对clojure应用的设置。

我找到了这个答案:How do you enable https and http->https redirects in ring / compojure

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

EN

回答 5

Stack Overflow用户

发布于 2015-01-20 06:07:15

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

  1. 首先,您需要使用keytool生成自签名证书,并将其安装到新的密钥库中。keytool文档非常好,可以指导你完成这个过程。请注意,如果使用自签名证书,则需要在大多数浏览器中添加例外规则,以表明您信任该证书。
  2. 将创建的密钥库文件复制到项目树的根目录下
  3. 更新jetty配置参数以指定ssl、ssl端口、密钥库文件和密钥库密码。使用project.clj
  4. Add -

-

  1. 配置选项将环/环缺省包添加到project.clj
  2. Add中,以强制https连接,即将http连接重定向到https。

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

就像这样

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2014-07-23 17:05:24

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

  1. 如果您使用的是Jetty适配器,它有ssl?ssl-port选项。related blog post here.
  2. You可以在普通的docs here中运行你的Ring应用程序,并在它前面放置一个代理,比如Nginx或Apache。代理将实现HTTPS,并将请求作为纯HTTP转发到您的应用程序。
票数 3
EN

Stack Overflow用户

发布于 2015-01-23 18:09:11

另一个解决方案是尝试nginx-clojure (http://nginx-clojure.github.io),通过它你可以直接在nginx上部署ring app。nginx可以更高效地做https的事情。

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

代码语言:javascript
复制
http {

### jvm dynamic library path
jvm_path '/usr/lib/jvm/java-7-oracle/jre/lib/amd64/server/libjvm.so';

### my app jars e.g. clojure-1.5.1.jar , groovy-2.3.4.jar ,etc.
jvm_var my_other_jars 'my_jar_dir/clojure-1.5.1.jar';

### my app classpath, windows user should use ';' as the separator
jvm_options "-Djava.class.path=jars/nginx-clojure-0.3.0.jar:#{my_other_jars}";

server {
  listen 80 default deferred;
  server_name example.com;

  ###redirect to https
  rewrite ^/(.+) https://example.com/$1 permanent;
}

server {
  listen 443 ssl;
  server_name example.com;

  ssl_certificate /opt/mycert/my-unified.crt;
  ssl_certificate_key /opt/mycert/my.key;


  location /myapp {
     content_handler_name 'my/ringapp';
  }

}

}

您可以从http://nginx.org/en/docs/http/configuring_https_servers.html获取有关SSL服务器配置的更多详细信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24897037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档