Skip to content
This repository was archived by the owner on Jul 30, 2019. It is now read-only.

Commit fb6b8d8

Browse files
Laszlo HordosLaszlo Hordos
Laszlo Hordos
authored and
Laszlo Hordos
committed
OPENICF-393 Add Secure communication support to .Net and test from Java
1 parent eae26ef commit fb6b8d8

File tree

5 files changed

+114
-26
lines changed

5 files changed

+114
-26
lines changed

ConnectorServerService/ConnectorServerService.cs

+25-16
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ namespace Org.ForgeRock.OpenICF.Framework.ConnectorServerService
5353
public partial class ConnectorServerService : ServiceBase
5454
{
5555
public const string PropKey = "connectorserver.key";
56+
public const string PropCertificateThumbprint = "connectorserver.certificateThumbprint";
5657
public const string PropFacadeLifetime = "connectorserver.maxFacadeLifeTime";
5758

5859
private Action _closeAction;
@@ -203,7 +204,6 @@ protected override void OnStop()
203204

204205
public class VtortConnectorServiceHost
205206
{
206-
private const string PropCertstore = "connectorserver.certificatestorename";
207207
private WebSocketListener _listener;
208208
private readonly ClientAuthenticationValidator _validator;
209209
private readonly Uri _endPointUri;
@@ -221,7 +221,7 @@ public void Open()
221221
{
222222
ipAddress = IPAddress.Loopback;
223223
}
224-
else if (!"*".Equals(_endPointUri.DnsSafeHost))
224+
else if (!"0.0.0.0".Equals(_endPointUri.DnsSafeHost))
225225
{
226226
ipAddress = IOUtil.GetIPAddress(_endPointUri.DnsSafeHost);
227227
}
@@ -320,26 +320,35 @@ public void Close()
320320
protected X509Certificate2 GetCertificate()
321321
{
322322
NameValueCollection settings = ConfigurationManager.AppSettings;
323-
String storeName = settings.Get(PropCertstore);
324-
if (storeName == null)
323+
String certificateThumbprint = settings.Get(ConnectorServerService.PropCertificateThumbprint);
324+
if (String.IsNullOrWhiteSpace(certificateThumbprint))
325325
{
326326
throw new Org.IdentityConnectors.Framework.Common.Exceptions.ConfigurationException(
327-
"Missing required configuration setting: " + PropCertstore);
327+
"Missing required configuration setting: " + ConnectorServerService.PropCertificateThumbprint);
328328
}
329329

330-
X509Store store = new X509Store(storeName,
331-
StoreLocation.LocalMachine);
332-
333-
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
334-
X509Certificate2Collection certificates = store.Certificates;
335-
if (certificates.Count != 1)
330+
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
331+
try
336332
{
337-
throw new Org.IdentityConnectors.Framework.Common.Exceptions.ConfigurationException(
338-
"There is supported to be exactly one certificate in the store: " + storeName);
333+
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
334+
335+
X509Certificate2 certificate =
336+
store.Certificates.Cast<X509Certificate2>()
337+
.FirstOrDefault(
338+
certificate1 =>
339+
String.Equals(certificate1.Thumbprint, certificateThumbprint,
340+
StringComparison.CurrentCultureIgnoreCase));
341+
if (certificate == null)
342+
{
343+
throw new Org.IdentityConnectors.Framework.Common.Exceptions.ConfigurationException(
344+
"The Certificate can not be found with thumbprint: " + certificateThumbprint);
345+
}
346+
return certificate;
347+
}
348+
finally
349+
{
350+
store.Close();
339351
}
340-
X509Certificate2 certificate = store.Certificates[0];
341-
store.Close();
342-
return certificate;
343352
}
344353

345354
private async Task ListenAsync()

ConnectorServerService/Program.cs

+74
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Diagnostics;
55
using System.IO;
66
using System.Reflection;
7+
using System.Security.Cryptography.X509Certificates;
78
using System.ServiceProcess;
89
using Org.ForgeRock.OpenICF.Framework.ConnectorServerService.Properties;
910
using Org.IdentityConnectors.Common.Security;
@@ -21,6 +22,7 @@ private static void Usage()
2122
Console.WriteLine(" /uninstall [/serviceName <serviceName>] - Uninstalls the service.");
2223
Console.WriteLine(" /run - Runs the service from the console.");
2324
Console.WriteLine(" /setKey [<key>] - Sets the connector server key.");
25+
Console.WriteLine(" /setCertificate - Sets secure server certificate thumbprint");
2426
Console.WriteLine(" /setDefaults - Sets default app.config");
2527
}
2628

@@ -46,6 +48,16 @@ private static void Main(string[] args)
4648
DoSetKey(args.Length > 1 ? args[1] : null);
4749
return;
4850
}
51+
if (cmd.Equals("/setCertificate", StringComparison.InvariantCultureIgnoreCase))
52+
{
53+
if (args.Length > 1)
54+
{
55+
Usage();
56+
return;
57+
}
58+
DoSetCertificate();
59+
return;
60+
}
4961
if (cmd.Equals("/setDefaults", StringComparison.InvariantCultureIgnoreCase))
5062
{
5163
if (args.Length > 1)
@@ -165,6 +177,68 @@ private static GuardedString ReadPassword()
165177
}
166178
}
167179

180+
private static void DoSetCertificate()
181+
{
182+
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
183+
try
184+
{
185+
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
186+
X509Certificate2Collection certificates = store.Certificates;
187+
int i = 0;
188+
if (certificates.Count > 0)
189+
{
190+
Console.WriteLine(@"Select certificate you want to use:");
191+
Console.WriteLine(@"Index Issued To Thumbprint");
192+
Console.WriteLine(@"----- --------- -------------------------");
193+
Console.WriteLine();
194+
foreach (var cerItem in certificates)
195+
{
196+
Console.WriteLine(@"{0,4}) {1,-25} {2}", i++,
197+
cerItem.GetNameInfo(X509NameType.SimpleName, false),
198+
cerItem.Thumbprint);
199+
}
200+
string line;
201+
Console.WriteLine();
202+
do
203+
{
204+
line = Console.ReadLine();
205+
if (!String.IsNullOrWhiteSpace(line))
206+
{
207+
try
208+
{
209+
int inputIndex = Convert.ToInt32(line);
210+
if (inputIndex >= 0 && inputIndex < certificates.Count)
211+
{
212+
X509Certificate2 certificate = store.Certificates[inputIndex];
213+
Configuration config =
214+
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
215+
config.AppSettings.Settings.Remove(ConnectorServerService.PropCertificateThumbprint);
216+
config.AppSettings.Settings.Add(ConnectorServerService.PropCertificateThumbprint,
217+
certificate.Thumbprint);
218+
config.Save(ConfigurationSaveMode.Modified);
219+
Console.WriteLine(@"Certificate Thumbprint has been successfully updated to {0}.",
220+
certificate.Thumbprint);
221+
break;
222+
}
223+
}
224+
catch (FormatException)
225+
{
226+
}
227+
Console.WriteLine(@"Invalid input: {0}", line);
228+
}
229+
} while (!String.IsNullOrWhiteSpace(line));
230+
}
231+
else
232+
{
233+
Console.WriteLine(@"No certificate was found in 'LocalMachine:My' store");
234+
}
235+
}
236+
finally
237+
{
238+
store.Close();
239+
}
240+
}
241+
168242
private static void DoSetKey(string key)
169243
{
170244
GuardedString str;

ConnectorServerService/Properties/Resources.Designer.cs

+2-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ConnectorServerService/Properties/Resources.resx

+3-3
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
&lt;!-- Access these values via the property:
125125
System.Configuration.ConfigurationManager.AppSettings[key]
126126
--&gt;
127-
&lt;add key="connectorserver.certificatestorename" value="ConnectorServerSSLCertificate" /&gt;
127+
&lt;add key="connectorserver.certificateThumbprint" value="Use certutil and copy: Cert Hash(sha1) Example:1b0889cdf9e0cee904646bb8a3d0aa4f72035056" /&gt;
128128
&lt;add key="connectorserver.maxFacadeLifeTime" value="0" /&gt;
129129
&lt;add key="connectorserver.key" value="lmA6bMfENJGlIDbfrVtklXFK32s=" /&gt;
130130
&lt;!-- Enable/Disable the logging proxy for all operations. --&gt;
@@ -157,8 +157,8 @@
157157
&lt;byteStreamMessageEncoding /&gt;
158158
&lt;httpTransport authenticationScheme="Basic" realm="OpenICF"&gt;
159159
&lt;webSocketSettings transportUsage="Always" createNotificationOnConnection="true"
160-
subProtocol="v1.openicf.forgerock.org" /&gt;
161-
&lt;/httpTransport&gt;
160+
subProtocol="v1.openicf.forgerock.org" /&gt;
161+
&lt;/httpTransport&gt;
162162
&lt;/binding&gt;
163163
&lt;/customBinding&gt;
164164
&lt;/bindings&gt;

FrameworkServer/ConnectorEventSubscriptionApiOpImpl.cs

+10-4
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,14 @@ public void OnNext(Org.IdentityConnectors.Framework.Common.Objects.ConnectorObje
301301
{
302302
if (null != value)
303303
{
304-
TryHandleResult(new
304+
if (!TryHandleResult(new
305305
ConnectorEventSubscriptionOpResponse
306306
{
307307
ConnectorObject = MessagesUtil.SerializeMessage<Common.ProtoBuf.ConnectorObject>(value)
308-
});
308+
}))
309+
{
310+
OnError(new Exception("Failed to Handle OnNext event."));
311+
}
309312
}
310313
}
311314

@@ -586,11 +589,14 @@ public void OnNext(OBJ.SyncDelta value)
586589
{
587590
if (null != value)
588591
{
589-
TryHandleResult(new
592+
if (!TryHandleResult(new
590593
SyncEventSubscriptionOpResponse
591594
{
592595
SyncDelta = MessagesUtil.SerializeMessage<Common.ProtoBuf.SyncDelta>(value)
593-
});
596+
}))
597+
{
598+
OnError(new Exception("Failed to Handle OnNext event."));
599+
}
594600
}
595601
}
596602

0 commit comments

Comments
 (0)