This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2023-10-10
Channels
- # babashka (37)
- # babashka-sci-dev (22)
- # beginners (16)
- # biff (12)
- # calva (40)
- # cider (6)
- # clj-kondo (7)
- # clojure (183)
- # clojure-austin (20)
- # clojure-doc (22)
- # clojure-europe (16)
- # clojure-nl (2)
- # clojure-norway (39)
- # clojure-romania (1)
- # clojure-uk (9)
- # clojuredesign-podcast (9)
- # clojurescript (29)
- # core-typed (66)
- # cursive (19)
- # data-science (14)
- # docker (5)
- # fulcro (6)
- # hyperfiddle (46)
- # java (5)
- # malli (19)
- # missionary (3)
- # off-topic (84)
- # pedestal (5)
- # portal (36)
- # reitit (35)
- # releases (2)
- # shadow-cljs (30)
- # web-security (2)
- # yamlscript (1)
I was trying to get a websocket running with https://github.com/babashka/http-client but did not find a way to create a private key from a pem-formatted file such that I could include it in the keystore. It seems that java.security.KeyFactory
is not included in babashka. Is there a known workaround?
Sidenote: I’m creating the SSLContext
by hand and not through the library as I’m building the keystore and truststore dynamically. I don’t have files for them.
These related classes are in bb: https://github.com/babashka/babashka/blob/7ecd2fe59e2f33c4aa98bfdcc54d4c5d5f1b1694/src/babashka/impl/classes.clj#L397-L402 Could you provide an example of how you are using KeyFactory? We can of course include it
Let me just add this class and you can try to use the master version when the build finishes, would that be ok?
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/security/spec/PKCS8EncodedKeySpec.html would also be missing for enabling the generation of the private key from PEM
(ns client
(:require
[clojure.string :as str])
(:import
[java.util Base64]
[java.security KeyFactory]
[java.security.spec PKCS8EncodedKeySpec]))
(defn load-pem-pk [file]
(let [key (slurp file)
private-key-pem (-> key
(str/replace "-----BEGIN PRIVATE KEY-----" "")
(str/replace "-----END PRIVATE KEY-----" "")
(str/replace (System/getProperty "line.separator") ""))
encoded (-> private-key-pem
(Base64/decodeBase64))]
(with-open [input-stream (java.io.ByteArrayInputStream. encoded)]
(let [key-factory (KeyFactory/getInstance "RSA")
key-spec (PKCS8EncodedKeySpec. (.readAllBytes input-stream))]
(.generatePrivate key-factory key-spec)))))
(ns client
(:require
[clojure.string :as str])
(:import
[java.util Base64]
[java.security KeyFactory]
[java.security.spec PKCS8EncodedKeySpec]))
I can also hand you a test (random) key:
-----BEGIN PRIVATE KEY-----
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
p0o468Znlgp+xcm4JolgkijqVlRE
-----END PRIVATE KEY-----
When I run this with JVM Clojure I get:
$ clj -M /tmp/dude.bb
Syntax error (IllegalArgumentException) compiling . at (/tmp/dude.bb:16:22).
No matching method decodeBase64 found taking 1 args for class java.util.Base64
Looks good, I can read in the private key now just fine. Thanks a lot again @U04V15CAJ! That is some fast support here
Hi! I am constructing a path like so:
(-> (fs/temp-dir) (str fs/file-separator "pango.png"))
Is there a way I can construct it without involving the separator? Like using only file objects and then str everything, or something.in fact, I would discourage creating strings yourself, just provide multiple paths to fs/path
I just recently did a bunch of stuff with babashka-fs myself. I had a very mild interest in keeping it windows compatible. I assumed if I avoided any strings of my own, it would remain OS independent is that true?