Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions data/templates/ocserv/ocserv_config.j2
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,15 @@ auth = "plain[otp=/run/ocserv/users.oath]"
{% else %}
auth = "plain[/run/ocserv/ocpasswd]"
{% endif %}
{% elif "certificate" in authentication.mode %}
auth = "certificate"
{% if authentication.mode.certificate == "cn" %}
cert-user-oid = 2.5.4.3
{% elif authentication.mode.certificate == "uid" %}
cert-user-oid = 0.9.2342.19200300.100.1.1
{% else %}
cert-user-oid = {{ authentication.mode.certificate }}
{% endif %}
{% else %}
auth = "plain[/run/ocserv/ocpasswd]"
{% endif %}
Expand Down
24 changes: 24 additions & 0 deletions interface-definitions/vpn_openconnect.xml.in
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,30 @@
<valueless/>
</properties>
</leafNode>
<leafNode name="certificate">
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@giga1699 I admit I misunderstood what the option actually does when I first reviewed the PR. I now understand that option is used to tell OCServ what certificate field to use as the user identifier. Please disregard my earlier comments.

Based on that, I think we can improve this CLI and make it more obvious what the option means.

For example, authentication mode certificate user-identifier-field <cn|uid|x.x.xx.xxx>.

My reasoning is:

  1. There's also cert-group-oid option to tell OCServ what field to use for the user group. If we put <cn|uid|...>, we cannot easily extend the CLI to support that in the future.
  2. I'm sure I'm not the only one who would have assumed that a bare cn option was supposed to have a particular CN as its argument, while user-identifier-field cn is obvious — that should be more obvious to people without a lot of experience with OCServ.

I'm open to proposals about the option name, not saying user-identifier-field is necessarily the best one.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have no objection with the name user-identifier-field

<properties>
<help>Use certificate based authentication</help>
<valueHelp>
<format>cn</format>
<description>OID 2.5.4.3 - Common Name</description>
</valueHelp>
<valueHelp>
<format>uid</format>
<description>OID 0.9.2342.19200300.100.1.1 - UID</description>
</valueHelp>
<valueHelp>
<format>x.x.xx.xxx</format>
<description>Custom OID in dotted decimal format</description>
</valueHelp>
<constraint>
<regex>(^\d{1,5}(?:\.\d{1,5})*$|cn|uid)</regex>
</constraint>
<constraintErrorMessage>Invalid OID selection. Must be cn, uid, or a valid OID format.</constraintErrorMessage>
<completionHelp>
<list>cn uid x.x.xx.xxx</list>
</completionHelp>
</properties>
</leafNode>
</children>
</node>
<node name="identity-based-config">
Expand Down
15 changes: 12 additions & 3 deletions src/conf_mode/vpn_openconnect.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,11 +104,17 @@ def verify(ocserv):
if 'authentication' in ocserv:
if 'mode' in ocserv['authentication']:
if (
'local' in ocserv['authentication']['mode']
and 'radius' in ocserv['authentication']['mode']
('local' in ocserv['authentication']['mode']
and 'radius' in ocserv['authentication']['mode'])
or
('local' in ocserv['authentication']['mode']
and 'certificate' in ocserv['authentication']['mode'])
or
('radius' in ocserv['authentication']['mode']
and 'certificate' in ocserv['authentication']['mode'])
):
raise ConfigError(
'OpenConnect authentication modes are mutually-exclusive, remove either local or radius from your configuration'
'OpenConnect authentication modes are mutually-exclusive. Only one of local, radius, or certificate.'
)
if 'radius' in ocserv['authentication']['mode']:
if 'server' not in ocserv['authentication']['radius']:
Expand Down Expand Up @@ -202,6 +208,9 @@ def verify(ocserv):
raise ConfigError('SSL certificate missing on OpenConnect config!')
verify_pki_certificate(ocserv, ocserv['ssl']['certificate'])

if 'ca_certificate' not in ocserv['ssl'] and 'certificiate' in ocserv['authentication']['mode']:
raise ConfigError('CA certificate must be provided in certificate authentication mode!')

if 'ca_certificate' in ocserv['ssl']:
for ca_cert in ocserv['ssl']['ca_certificate']:
verify_pki_ca_certificate(ocserv, ca_cert)
Expand Down
Loading