summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexandru Scvortov <alexandru@rabbitmq.com>2010-09-03 19:17:33 +0100
committerAlexandru Scvortov <alexandru@rabbitmq.com>2010-09-03 19:17:33 +0100
commitc0ff105b7ba12106a2234fdde009ae737e851889 (patch)
tree0a22bd75e77b0349f902d75fa4e61c733094dce5 /src
parent5eb1d5bc26a5330e5119ff1d562ac2a246bd1105 (diff)
downloadrabbitmq-server-git-c0ff105b7ba12106a2234fdde009ae737e851889.tar.gz
first stab at extracting information from certificates
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_reader.erl33
1 files changed, 31 insertions, 2 deletions
diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl
index 09270ebf28..b375d6e410 100644
--- a/src/rabbit_reader.erl
+++ b/src/rabbit_reader.erl
@@ -72,7 +72,7 @@
client_properties]).
-define(SSL_KEYS,
- [ssl_subject, ssl_fingerprint, ssl_ca]).
+ [ssl_cn, ssl_issuer, ssl_validity]).
-define(INFO_KEYS, ?CREATION_EVENT_KEYS ++ ?STATISTICS_KEYS ++ ?SSL_KEYS -- [pid]).
@@ -823,6 +823,8 @@ i(port, #v1{sock = Sock}) ->
i(peer_address, #v1{sock = Sock}) ->
{ok, {A, _}} = rabbit_net:peername(Sock),
A;
+i(ssl_issuer, #v1{sock = Sock}) ->
+ get_ssl_info(fun get_ssl_issuer/1, Sock);
i(ssl_subject, #v1{sock = Sock}) ->
get_ssl_info(fun (Cert) ->
TBSCert = Cert#'OTPCertificate'.tbsCertificate,
@@ -873,10 +875,37 @@ get_ssl_info(F, Sock) ->
nossl -> nossl;
no_peer_certificate -> no_peer_certificate;
{ok, Cert} ->
- io:format("Some information: ~p~n", [F(Cert)]),
F(Cert)
end.
+get_ssl_issuer(#'OTPCertificate' {
+ tbsCertificate = #'OTPTBSCertificate' {
+ issuer = Issuer }}) ->
+ case extract_ssl_values(Issuer) of
+ [I] -> I;
+ _ -> cantsay
+ end;
+get_ssl_issuer(_) ->
+ cantsay.
+
+extract_ssl_values({rdnSequence, List}) ->
+ extract_ssl_values2(List).
+
+extract_ssl_values2([[#'AttributeTypeAndValue'{value = V}] | Rest]) ->
+ [parse_erlang_value(V) | extract_ssl_values2(Rest)];
+extract_ssl_values2([_|Rest]) ->
+ extract_ssl_values2(Rest);
+extract_ssl_values2([]) ->
+ [].
+
+parse_erlang_value({printableString, S}) ->
+ S;
+parse_erlang_value({utf8String, Bin}) ->
+ Bin;
+parse_erlang_value(V) ->
+ V.
+
+
%%--------------------------------------------------------------------------
send_to_new_channel(Channel, AnalyzedFrame, State) ->