Clojure复合环和https
我正在使用Clojure(ring和compojure)构建一个web应用程序,我不知道从哪里开始使用https。我有一个注册和登录,将需要安全,然后一旦他们的身份验证,他们将需要留在https 我似乎找不到一个关于一般设置https或专门为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应用程序前面充当一个代理。这被
这是否意味着我可以编写我的compojure应用程序,就好像没有https一样,让nginx坐在前面为我处理所有这些事情?是的,标准程序是让nginx在基于环的Web应用程序前面充当一个代理。这被认为是安全的,更容易维护,因为它更标准。我所知道的每一个应用程序都是这样做的。通常应用程序级代码并不关心它是HTTPS还是HTTP。它通常由应用服务器或其前面的代理提供。如果您熟悉,那么您的选择与Java世界中的选择几乎相同
ssl?
和ssl端口
选项。见和反向代理方法似乎是最常见的选择。然而,作为一个“实验”,我研究了如何在https中使用just ring、jetty compojure等。没那么难
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支持,只需执行以下操作:
我在尝试使用社交媒体代码测试登录时遇到了类似的问题,很明显,社交媒体代码必须通过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的应用程序开发了它