<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TechJockey.NET</title>
	<atom:link href="https://techjockey.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://techjockey.net</link>
	<description>Tech Blog</description>
	<lastBuildDate>Fri, 07 Jan 2022 14:17:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.1</generator>
	<item>
		<title>Airflow, Azure and OAuth</title>
		<link>https://techjockey.net/airflow-azure-and-oauth/</link>
					<comments>https://techjockey.net/airflow-azure-and-oauth/#respond</comments>
		
		<dc:creator><![CDATA[Andy]]></dc:creator>
		<pubDate>Thu, 06 Jan 2022 21:10:32 +0000</pubDate>
				<category><![CDATA[Apache Airflow]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://techjockey.net/?p=4070</guid>

					<description><![CDATA[NOTE: This is an incomplete article &#8211; I will continue to publish more as I can. I have provided the needed code for &#8220;webserver_config.py&#8221; I have&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[
<p>NOTE: This is an incomplete article &#8211; I will continue to publish more as I can. I have provided the needed code for &#8220;webserver_config.py&#8221; I have not included information for the &#8220;App Registration&#8221; in Azure.</p>
<p>This article stems from me not finding enough information, in one place, pertaining to authenticating to <a href="https://airflow.apache.org/">Apache Airflow</a> leveraging OAuth and Azure.<br /><br />I was able to piece what I needed together using documentation from different sources: GitHub, Flask, Apache, etc.<br /><br />My hope is that this article provide you with the information needed to get authentication functional in your environment.<br /><br />If you are using the Apache Airflow public helm chart &#8211; this is the code that will help get you going. This can be added to your &#8220;values.yaml&#8221; or &#8220;overrides.yaml&#8221; file.  If not using a helm chart, then add the python portion &#8211; starting with the first &#8220;from&#8221; to the end of the code block and add it to your &#8220;webserver_config.py&#8221; file.</p>



<pre class="wp-block-code"><code>webserver:
  service:
    type: NodePort
  webserverConfig: |
    
    from airflow.www.security import AirflowSecurityManager
    import logging
    from typing import Dict, Any, List, Union
    from flask_appbuilder.security.manager import AUTH_OAUTH
    import os

    # basedir = os.path.abspath(os.path.dirname(__file__))

    WTF_CSRF_ENABLED = True
    # SQLALCHEMY_DATABASE_URI = conf.get("core", "SQL_ALCHEMY_CONN")

    AUTH_TYPE = AUTH_OAUTH
    AUTH_ROLES_SYNC_AT_LOGIN = True
    PERMANENT_SESSION_LIFETIME = 1800 # force users to reauth after inactivity period time in seconds
    AUTH_USER_REGISTRATION = True
    AUTH_USER_REGISTRATION_ROLE = "Public"

    class AzureRoleBasedSecurityManager(AirflowSecurityManager):
        def _get_oauth_user_info(self, provider, resp):
            if provider == "azure":
                me = self._azure_jwt_token_parse(resp&#91;"id_token"])
                return {
                    "id": me&#91;"oid"],
                    "username": me&#91;"upn"],
                    "name": me&#91;"name"],
                    "email": me&#91;"upn"],
                    "first_name": me&#91;"given_name"],
                    "last_name": me&#91;"family_name"],
                    "role_keys": me&#91;"roles"],
                }
            return {}
        oauth_user_info = _get_oauth_user_info

    SECURITY_MANAGER_CLASS = AzureRoleBasedSecurityManager

    # In order of least permissive - default is "Public" - see AUTH_USER_REGISTRATION_ROLE
    AUTH_ROLES_MAPPING = {
      "Public": &#91;"Public"],
      "Viewer": &#91;"Viewer"],
      "User": &#91;"User"],
      "Op": &#91;"Op"],
      "Admin": &#91;"Admin"],
    }

    OAUTH_PROVIDERS = &#91;
      {
        "name": "azure",
        "icon": "fa-windows",
        "token_key": "access_token",
        "remote_app": {
          "client_id": "&lt;from Azure&gt;",
          "client_secret": "&lt;from Azure&gt;",
          "api_base_url": "https://login.microsoftonline.com/&lt;from Azure&gt;/oauth2",
          "client_kwargs": {
            "scope": "User.read name preferred_username email profile upn",
            "resource": "&lt;from Azure&gt;"},
          "access_token_url": "https://login.microsoftonline.com/&lt;from Azure&gt;/oauth2/token",
          "authorize_url": "https://login.microsoftonline.com/&lt;from Azure&gt;/oauth2/authorize",
          "request_token_url": None,
        },
      },
    ]</code></pre>



<p><p><br></p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://techjockey.net/airflow-azure-and-oauth/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>F5 iRule &#8212; No Pool Members Available Vanity Page</title>
		<link>https://techjockey.net/irule-returns-splash-page-when-no-members-available/</link>
					<comments>https://techjockey.net/irule-returns-splash-page-when-no-members-available/#comments</comments>
		
		<dc:creator><![CDATA[Jim]]></dc:creator>
		<pubDate>Sun, 15 Aug 2021 03:01:50 +0000</pubDate>
				<category><![CDATA[F5]]></category>
		<category><![CDATA[iRule]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[F5 LTM]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Scripting]]></category>
		<guid isPermaLink="false">https://techjockey.net/?p=138</guid>

					<description><![CDATA[I wrote a iRule post located here, where I describe the essentials behind how beneficial iRules can be and the many use cases they have. I&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>I wrote a iRule post located <a title="F5 iRules" href="https://techjockey.net/f5-irules/">here</a>, where I describe the essentials behind how beneficial iRules can be and the many use cases they have. I stumbled across a situation the other day for a client. This client had an F5 VIP load balancing 2 web servers of theirs. Now if those web servers for some reason are not available due to their healthcheck monitor failing, the users of that web site will receive a white page as the F5 will not proxy the traffic because there are no available pool members. I thought what if this was a big site, should users be left in the dark about a web site they use frequently when it&#8217;s not available? Then the idea of having the F5 LTM bounce back a well-formed splash page. This splash page would inform the user that the web site temporarily down, and if they believe this result is in error to contact their helpdesk.</p>
<p>This situation can be remedied with a couple of lines in an iRule.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">when HTTP_REQUEST {
    #check if no members available
    if { [active_members [LB::server pool]] == 0 } {
       #create data variables with HTML content to send to client
       set httphost [string tolower [HTTP::host]]
       set data "&lt;h2&gt;$httphost&lt;/h2&gt;&lt;h3&gt;NOTICE: Site Unavailable.&lt;/h3&gt;If you believe you are receiving this message in error, contact your site administrator."
       #send the HTML string
       HTTP::respond 200 content $data
    }
    #unset variables
    unset $httphost
    unset $data
}</pre>
<p><strong><img loading="lazy" class="alignnone wp-image-3920" src="https://techjockey.net/wp-content/uploads/splashtest1-300x84.png" alt="" width="518" height="145" srcset="https://techjockey.net/wp-content/uploads/splashtest1-300x84.png 300w, https://techjockey.net/wp-content/uploads/splashtest1.png 609w" sizes="(max-width: 518px) 100vw, 518px" /></strong><span id="more-138"></span></p>
<p><strong>Or:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">when HTTP_REQUEST {
   #check if no members available
   if { [active_members [LB::server pool]] == 0 } {
      HTTP::respond 200 content {
         &lt;h3&gt;Site Unavailable&lt;/h3&gt;&lt;p style="font-weight: normal; color: #eb2305; background-color: #050505; font-size: 12px; text-align: left;"&gt;If you believe you are receiving this message in error, contact your site administrator.&lt;/p&gt;
       } #end of content block
   }
}
</pre>
<p><img loading="lazy" class="alignnone wp-image-3922" src="https://techjockey.net/wp-content/uploads/splashtest2-300x114.png" alt="" width="487" height="185" srcset="https://techjockey.net/wp-content/uploads/splashtest2-300x114.png 300w, https://techjockey.net/wp-content/uploads/splashtest2.png 491w" sizes="(max-width: 487px) 100vw, 487px" /></p>
<p>This iRule uses the <a href="https://devcentral.f5.com/wiki/iRules.http_request.ashx" target="_blank" rel="noopener noreferrer">when HTTP_REQUEST</a> event, and the <a href="https://devcentral.f5.com/wiki/irules.HTTP__respond.ashx" target="_blank" rel="noopener noreferrer">HTTP::respond</a> function. You could also use the <a href="https://devcentral.f5.com/wiki/iRules.HTTP__redirect.ashx" target="_blank" rel="noopener noreferrer">HTTP::redirect</a> function, however for something as small as a few lines, might as well have the F5 handle it directly.<br />
You could easily use links from other sources to make a more authentic looking page for your users. I like to embed images for my customers using the img and base64 tag, such as</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">when HTTP_REQUEST {
  set VSPool [LB::server pool]
  if { [active_members $VSPool] &lt; 1 } {
    HTTP::respond 200 content "&lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&gt;
&lt;html xml:lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\"&gt;&lt;head&gt;

    &lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"&gt;
    &lt;title&gt;Maintenance Page&lt;/title&gt;

&lt;style type=\"text/css\"&gt;
#MainContent {
    height: 500px;
    font-family: Verdana, Helvetica, Arial, sans;
    font-size: 14px;
    color: #625746;
    position: absolute;
    top: 330px;
    left: 180px;
    width: 900px;
}

#MainContent p {
    width: 450px;
}

a {
    color:#60A2B9;
}
a:hover {
    text-decoration: none;
}
&lt;/style&gt;
&lt;/head&gt;&lt;body&gt;
    &lt;div id=\"MainContent\"&gt;
        &lt;p&gt;&lt;strong&gt;Site Unavailable!&lt;/strong&gt;&lt;/p&gt;
&lt;img src='data:image/png;base64,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'/&gt;
        &lt;p&gt; We are sorry, but the site you are looking for is temporarily out of service.
            If you feel you have reached this page in error, please try again.&lt;/p&gt;

        &lt;p&gt;Thank you!&lt;/p&gt;
    &lt;/div&gt;
&lt;/body&gt;&lt;/html&gt;"
  }
}
</pre>
<p>Which gives us a embedded image without relying on external URLs. I used <a href="https://codebeautify.org/image-to-base64-converter">https://codebeautify.org/image-to-base64-converter</a> to perform the base64 conversion.</p>
<p><img loading="lazy" class="alignnone wp-image-3928" src="https://techjockey.net/wp-content/uploads/splashtest3-300x201.png" alt="" width="613" height="411" srcset="https://techjockey.net/wp-content/uploads/splashtest3-300x201.png 300w, https://techjockey.net/wp-content/uploads/splashtest3-768x516.png 768w, https://techjockey.net/wp-content/uploads/splashtest3.png 959w" sizes="(max-width: 613px) 100vw, 613px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://techjockey.net/irule-returns-splash-page-when-no-members-available/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Cisco ACL &#8212; Dedicated Internet Edge Drop Device</title>
		<link>https://techjockey.net/internet-edge-drop-device-acl/</link>
					<comments>https://techjockey.net/internet-edge-drop-device-acl/#respond</comments>
		
		<dc:creator><![CDATA[Jim]]></dc:creator>
		<pubDate>Sat, 17 Apr 2021 16:38:19 +0000</pubDate>
				<category><![CDATA[Cisco]]></category>
		<category><![CDATA[Firewall]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://techjockey.net/?p=3598</guid>

					<description><![CDATA[A dedicated drop device is a network appliance, usually a router or L3 switch that sites at the very edge of your network infrastructure. Beyond the&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>A dedicated drop device is a network appliance, usually a router or L3 switch that sites at the very edge of your network infrastructure. Beyond the firewall, and usually acts a as either layer 2 or 3 transit devices for your ISP interconnect uplinks for public or untrusted segments. Distinguishing a dedicated drop devices in your infrastructure interconnected chain of paths can enhance and offload many irrelevant packet transactions from ever hitting your Firewall mitigation appliances. The thought around this approach is to remove processing cycles away from your more expensive security appliances such as firewalls or IPS, allowing said devices to dedicate their efforts toward more complicated session and/or application driven attacks.</p>
<p><a href="https://techjockey.net/wp-content/uploads/DedicatedDropDevice.png"><img loading="lazy" class="wp-image-3600 aligncenter" src="https://techjockey.net/wp-content/uploads/DedicatedDropDevice-300x172.png" alt="" width="609" height="349" srcset="https://techjockey.net/wp-content/uploads/DedicatedDropDevice-300x172.png 300w, https://techjockey.net/wp-content/uploads/DedicatedDropDevice-768x441.png 768w, https://techjockey.net/wp-content/uploads/DedicatedDropDevice.png 776w" sizes="(max-width: 609px) 100vw, 609px" /></a></p>
<p><span id="more-3598"></span></p>
<h5>Where to start&#8230;</h5>
<p>A common trend I&#8217;ve seen over the years at multiple business is to create such a ACL on the perimeter edge device to block way too much. ACL length kept a short as possible. I&#8217;ve seen some grow to over 100 lines, which is unnecessary. The justification is usually an outbreak or single malicious actor caused said actors IP to be added the Drop ACL. In my opinion this is not the point of this Drop ACL. The Drop ACL should be static, well thought-out and compared against services you offer to the public internet, not a &#8220;o crap block it now!&#8221;  access-list. A common counter argument I hear is &#8220;our Drop ACL has grown over time to form our own reputation based blocklist&#8221;, I believe this should be handled by your firewall or IPS device. Most Firewalls or IPS now-a-days have built in reputation based intelligence, and if needed a user-defined blocklist can be managed much easier as well. The table below is a basic table to document the Drop ACL creation process, this should be brainstormed with NetAdmins, Security Officers, and select business owners to arrive at a well established drop list without negatively impacting your business. For example, you will want to talk with your business owners to know if you do indeed need ICMP or PING because it is used by a legitimate third-party to monitor your network health and status.</p>
<h5>Simple Starting List</h5>
<table style="height: 452px; width: 100%; border-collapse: collapse; border-style: solid;" cellpadding="0">
<tbody>
<tr style="height: 27px;">
<td style="width: 5.84154%; height: 10px;"><strong>ICMP</strong></td>
<td style="width: 10.1782%; height: 10px;">IP Proto 1</td>
<td style="width: 58.9803%; height: 10px;">Does your business or app require to expose ICMP messages to public/untrusted network?</td>
</tr>
<tr style="height: 27px;">
<td style="width: 5.84154%; height: 27px;"><strong>PING</strong></td>
<td style="width: 10.1782%; height: 27px;">IP Proto 1 Type 0</td>
<td style="width: 58.9803%; height: 27px;">Does your business or app require any public endpoint to ping your global IP?</td>
</tr>
<tr style="height: 27px;">
<td style="width: 5.84154%; height: 10px;"><strong>SNMP</strong></td>
<td style="width: 10.1782%; height: 10px;">TCP/UDP 161/162</td>
<td style="width: 58.9803%; height: 10px;">Management Service, should not be coming from public/untrusted network</td>
</tr>
<tr style="height: 27px;">
<td style="width: 5.84154%; height: 27px;"><strong>BOOTP</strong></td>
<td style="width: 10.1782%; height: 27px;">UDP 67/68</td>
<td style="width: 58.9803%; height: 27px;">BOOTP from external source, common with residential or business ISPs. Not usually seen with dedicated ISPs.</td>
</tr>
<tr style="height: 54px;">
<td style="width: 5.84154%; height: 54px;"><strong>TFTP</strong></td>
<td style="width: 10.1782%; height: 54px;">UDP 69</td>
<td style="width: 58.9803%; height: 54px;">Management Service, should not be coming from public/untrusted network</td>
</tr>
<tr style="height: 54px;">
<td style="width: 5.84154%; height: 54px;"><strong>TELNET</strong></td>
<td style="width: 10.1782%; height: 54px;">TCP 23</td>
<td style="width: 58.9803%; height: 54px;">Management Service, should not be coming from public/untrusted network</td>
</tr>
<tr style="height: 27px;">
<td style="width: 5.84154%; height: 27px;"><strong>SSH/SFTP</strong></td>
<td style="width: 10.1782%; height: 27px;">TCP 22</td>
<td style="width: 58.9803%; height: 27px;">Management Service and Secure File Transfer, should not be coming from public/untrusted network, check with business.</td>
</tr>
<tr style="height: 27px;">
<td style="width: 5.84154%; height: 27px;"><strong>EIGRP</strong></td>
<td style="width: 10.1782%; height: 27px;">IP Proto 88</td>
<td style="width: 58.9803%; height: 27px;">More likely then not, you won&#8217;t be using OSPF on your Internet Edge, more likely BGP</td>
</tr>
<tr style="height: 27px;">
<td style="width: 5.84154%; height: 27px;"><strong>OSPF</strong></td>
<td style="width: 10.1782%; height: 27px;">IP Proto 89</td>
<td style="width: 58.9803%; height: 27px;">More likely then not, you won&#8217;t be using OSPF on your Internet Edge, more likely BGP</td>
</tr>
<tr style="height: 54px;">
<td style="width: 5.84154%; height: 54px;"><strong>RADIUS</strong></td>
<td style="width: 10.1782%; height: 54px;">UDP/TCP 1812/1813</td>
<td style="width: 58.9803%; height: 54px;">AAA mechanism for user-based authentication/access/accounting. Should never be used on public interfaces. Use on internal OOB management network.</td>
</tr>
<tr style="height: 54px;">
<td style="width: 5.84154%; height: 54px;"><strong>TACACS</strong>+</td>
<td style="width: 10.1782%; height: 54px;">UDP/TCP 49</td>
<td style="width: 58.9803%; height: 54px;">AAA mechanism for user-based authentication/access/accounting. Should rarely be used on public interfaces. Use on internal OOB management network.</td>
</tr>
<tr style="height: 27px;">
<td style="width: 5.84154%; height: 27px;"><strong>SYSLOG</strong></td>
<td style="width: 10.1782%; height: 27px;">TCP/UDP 514</td>
<td style="width: 58.9803%; height: 27px;">Forwarding and transferring syslog based messages. Should not be on public interface for DLP reasons.</td>
</tr>
<tr style="height: 27px;">
<td style="width: 5.84154%; height: 27px;">etc&#8230;</td>
<td style="width: 10.1782%; height: 27px;"></td>
<td style="width: 58.9803%; height: 27px;"></td>
</tr>
</tbody>
</table>
<p>You can see that there is not a &#8220;one size fits all&#8221; approach, however there are several common overlaps and many of the items on this basic Drop ACL tend to be management or routing protocols. For example from the list above, you should never see SNMP coming from a public endpoint, even if you have a external third-party monitoring your assets via SNMP for you. Another example is, I once worked for a consulting company that used TACACS based connections over the public internet to encrypt user-logins of managed devices. This was scene as acceptable to the business because TACACS is an encrypted protocol. Therefore you will need to decide with your team(s) what makes the most sense.</p>
<h5>Adding a Wider Range of items to the List&#8230;</h5>
<p>Just like the previous section, the Drop ACL should not be a massive list of IP hosts and ranges. I would even argue against things like Geo Blocklist being on this list as most modern Firewalls have this ability built in.</p>
<table style="border-collapse: collapse; width: 100%; height: 420px;">
<tbody>
<tr style="height: 32px;">
<td style="width: 99.8748%; height: 32px;" colspan="3"><span style="font-size: 12pt;"><strong>Basic IP Host and Ranges</strong></span></td>
</tr>
<tr style="height: 101px;">
<td style="width: 27.4246%; height: 90px;"><a href="https://tools.ietf.org/html/rfc1918">RFC-1918 &#8220;Private Address Space&#8221;</a></td>
<td style="width: 20.2614%; height: 90px;">
<pre>10.0.0.0/8
172.16.0.0/12
192.168.0.0/16</pre>
</td>
<td style="width: 52.1888%; height: 90px;">Private Ranges, not routable on the internet. Prevent spoofing.</td>
</tr>
<tr style="height: 61px;">
<td style="width: 27.4246%; height: 61px;"><a href="https://tools.ietf.org/html/rfc3927">RFC-3927 &#8220;Link Local Address Space&#8221;</a></td>
<td style="width: 20.2614%; height: 61px;">
<pre>169.254.0.0/16</pre>
</td>
<td style="width: 52.1888%; height: 61px;">Commonly used on windows machines when DHCP/BOOTP is not used on a LAN network.</td>
</tr>
<tr style="height: 27px;">
<td style="width: 27.4246%; height: 27px;"><a href="https://tools.ietf.org/html/rfc5737">RFC-5737 &#8220;Test Network Address Space&#8221;</a></td>
<td style="width: 20.2614%; height: 27px;">
<pre>192.0.2.0/24
198.51.100.0/24
203.0.113.0/24</pre>
</td>
<td style="width: 52.1888%; height: 27px;">These are IP address ranges used in public documentation TEST-NET-1, TEST-NET-2,TEST-NET-3</td>
</tr>
<tr style="height: 27px;">
<td style="width: 27.4246%; height: 27px;"><a href="https://tools.ietf.org/html/rfc3330">RFC-3330 &#8220;Special-Use Reservations&#8221;</a></td>
<td style="width: 20.2614%; height: 27px;">
<pre>0.0.0.0/8
127.0.0.0/8
255.255.255.255/32</pre>
</td>
<td style="width: 52.1888%; height: 27px;">These are special IP address reservations that should not be internet routable, and are common with spoofing and source-less based attacks. 255.255.255.255/32 should never be forwarded outside the subnet source.</td>
</tr>
<tr style="height: 61px;">
<td style="width: 27.4246%; height: 61px;"><a href="https://tools.ietf.org/html/rfc3068">RFC-3068 &#8220;6to4  Relay Anycast&#8221;</a></td>
<td style="width: 20.2614%; height: 61px;">
<pre class="newpage">192.88.99.0/24</pre>
</td>
<td style="width: 52.1888%; height: 61px;">Reserved by IANA to help with migration from IPv6 to IPv4 via 6to4 anycast relaying.</td>
</tr>
<tr style="height: 61px;">
<td style="width: 27.4246%; height: 61px;"><a href="https://tools.ietf.org/html/rfc2544">RFC-2544 &#8220;Internet Benchmark&#8221;</a></td>
<td style="width: 20.2614%; height: 61px;">
<pre class="newpage">198.18.0.0/15</pre>
</td>
<td style="width: 52.1888%; height: 61px;">Block of IP address to be used for benchmark interconnected devices and documentation.</td>
</tr>
<tr style="height: 61px;">
<td style="width: 27.4246%; height: 61px;"><a href="https://tools.ietf.org/html/rfc1112#section-4">RFC-1112-SECTION-4 &#8220;Reserved for Future User&#8221;</a></td>
<td style="width: 20.2614%; height: 61px;">
<pre class="newpage">240.0.0.0/4
255.0.0.0/8</pre>
</td>
<td style="width: 52.1888%; height: 61px;">Huge block of IP addresses dedicated for future use by IANA, but never used. SMH.</td>
</tr>
</tbody>
</table>
<h5>Crafting a basic Drop ACL brew&#8230;</h5>
<p>Putting the above two(2) sections into IOS format, I arrived at the following ACL.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">ip access-list extended DropACL
permit icmp any any traceroute
permit icmp any any echo-reply
!
remark *******Block Routing Protocols*******
deny ospf any any
deny eigrp any any
remark *******Block Mgmt Services*******
deny udp any any eq bootpc
deny udp any any eq bootps
deny udp any any eq snmp
deny tcp any any eq snmp
deny udp any any eq syslog
deny tcp any any eq syslog
deny udp  any any eq snmptrap
deny tcp any any eq snmptrap
deny tcp any any eq telnet
deny udp any any eq tftp
deny tcp any any eq 22
deny tcp any any eq tacacs
deny udp any any eq tacacs
deny tcp any any range 1812 1813
deny udp any any range 1812 1813
remark *******RFC1918 Spoofing*******
deny ip 10.0.0.0 0.255.255.255 any
deny ip 172.16.0.0 0.15.255.255 any
deny ip 192.168.0.0 0.0.255.255 any
remark *******RFC3330 Spoofing*******
deny ip 0.0.0.0 0.255.255.255 any
deny ip 127.0.0.0 0.255.255.255 any
deny ip 192.0.2.0 0.0.0.255 any
deny ip 169.254.0.0 0.0.255.255 any
deny ip 192.88.99.0 0.0.0.255 any
deny ip 198.18.0.0 0.1.255.255 any
deny ip 240.0.0.0 15.255.255.255 any
deny ip 255.0.0.0 0.255.255.255 any
remark *******Unallocated Spoofing*******
deny ip 128.0.0.0 0.0.255.255 any
deny ip 191.255.0.0 0.0.255.255 any
deny ip 192.0.0.0 0.0.0.255 any
deny ip 223.255.255.0 0.0.0.255 any
!
remark *******Multicast Spoofing*******
deny ip 224.0.0.0 31.255.255.255 any
!
remark ***********************************
remark ***Allow Transit Traffic***********
permit ip any any</pre>
<p>Look at that, we kept it under 50 lines! Most of the duplicate lines are because many of these protocols can use either UDP or TCP as transports.</p>
<h5>Ask my Dad the ISP for help&#8230;</h5>
<p>The IETF derived a &#8220;best pratice&#8221; to further assist in the fight against spoofing attacks. IETF came up with Ingress Filtering in RFC 2827 and RFC-3704. These are not hard tangible items throughout the internet, but a best practice &#8220;honor&#8221; based method to reduce source address spoofing of internet traffic. In basic terms it documents that ISPs acting as upstream providers for customers should filter packets entering their(ISP) network from these customers and discard them that do not match the source addressing agreed upon and allocated to that customer. See <a href="https://www.senki.org/everyone-should-be-deploying-bcp-38-wait-they-are/">https://www.senki.org/everyone-should-be-deploying-bcp-38-wait-they-are/</a></p>
<p>This will not really protect you, but it is you doing your part to help in case an asset of yours becomes comprised.</p>
<h5>Sources:</h5>
<ul>
<li><a href="https://www.cisco.com/c/en/us/td/docs/solutions/Enterprise/Security/Baseline_Security/securebasebook/appendxA.html">https://www.cisco.com/c/en/us/td/docs/solutions/Enterprise/Security/Baseline_Security/securebasebook/appendxA.html</a></li>
<li><a href="https://tools.ietf.org/html/rfc6890">https://tools.ietf.org/html/rfc6890</a></li>
<li><a href="https://tools.ietf.org/html/rfc6441">https://tools.ietf.org/html/rfc6441</a></li>
<li><a href="https://media.defense.gov/2020/Aug/18/2002479461/-1/-1/0/HARDENING_NETWORK_DEVICES.PDF">https://media.defense.gov/2020/Aug/18/2002479461/-1/-1/0/HARDENING_NETWORK_DEVICES.PDF</a></li>
<li><a href="https://www.cisco.com/c/en/us/support/docs/ip/access-lists/44541-tacl.html">https://www.cisco.com/c/en/us/support/docs/ip/access-lists/44541-tacl.html</a></li>
<li><a href="https://www.senki.org/everyone-should-be-deploying-bcp-38-wait-they-are/">https://www.senki.org/everyone-should-be-deploying-bcp-38-wait-they-are/</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://techjockey.net/internet-edge-drop-device-acl/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Security Through Obscurity</title>
		<link>https://techjockey.net/security-through-obscurity/</link>
					<comments>https://techjockey.net/security-through-obscurity/#respond</comments>
		
		<dc:creator><![CDATA[Andy]]></dc:creator>
		<pubDate>Fri, 16 Apr 2021 19:30:56 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://techjockey.net/?p=3625</guid>

					<description><![CDATA[Security Through Obscurity? This my first ever post and I feel it’s a pertinent one to mention. What is it and why is it bad? Security&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>Security Through Obscurity?</p>
<p>This my first ever post and I feel it’s a pertinent one to mention.</p>
<p>What is it and why is it bad?<br />
Security through obscurity can be said to be bad because it often implies that the obscurity is being used as the principal means of security. Obscurity is fine until it is discovered, but once someone has worked out your particular obscurity, then your system is vulnerable again. [source: <a href="https://en.wikipedia.org/wiki/Security_through_obscurity">https://en.wikipedia.org/wiki/Security_through_obscurity</a>]</p>
<p>Security is an often overlooked topic in organizations. I’ve heard many different arguments for why things were configured a certain way. Once thing that stands is security through obscurity should never be overlooked. Things are always secure, until they’re not. You should never expose something publicly that is not meant to be exposed publicly.</p>
<p><span id="more-3625"></span></p>
<p>For example:<br />
A typical company, that has publicly hosted domains, will have a public facing presence on the internet. This usually means there will be a public IP address with a Network Area Translation, or NAT for short, to a private IP address on a corporate or cloud network.</p>
<p>This private IP address is typically hosted in an isolated area called a demilitarized zone, or DMZ for short.</p>
<p>The DMZ is designed to be an isolated area of a company network. You need special rules to get in or out of this particular network. And in many cases there are special rules to allow you in to the systems/applications etc. that are within that network.</p>
<p>The main purpose of the NAT is to translate an public IP address into a private IP address. The private IP address is unknown to the public.</p>
<p>When we type the name for websites like “duckduckgo.com” or “reddit.com” our computers know how to translate these into an IP address (there is a lot of magic happening behind the scenes here that we won’t discuss).</p>
<p>Generally, speaking these names translate to a public IP address. That public IP address then is translated by network appliances to a private IP address (as previously mentioned).</p>
<p>There are scenarios, for example when you are on a corporate network or corporate virtual private network, VPN. Where applications used by the company are resolving to private IP addresses. This is normal and expected.</p>
<p>That’s a lot of explaining, right?&#8230;</p>
<p>Not entirely, there is a lot more at play that we won’t cover. But for arguments sake the norm for appropriate security is things that should be kept private are not to be exposed publicly.</p>
<p>There are specific networks in the protocol for IP version 4 (IPv4) that are meant to be private. This is the RFC 1918 standard for IPv4. We have several large groups of private IP addresses that are inaccessible publicly unless you specifically allow that traffic into your network through a NAT.</p>
<p>This changes with IPv6, but that is out of scope of the scenario in question.</p>
<p>For the purpose of this case will use “example.com” as the public domain record. Think of “example.com” as “google.com”, you can access it anywhere with an internet connection.</p>
<p>I came across a case in which I discovered an application with a public name record “example.com” was returning an IPv4 private IP address. At its surface, this does not seem to be a particularly large issue. As previously stated with RFC 1918 (the private IP scope) &#8211; I am unable to access that site since we are unable to access private resources from a public network without a NAT.</p>
<p>Currently, I’m safe. Nothing to worry about, right?&#8230;</p>
<p>Wrong.</p>
<p>Why is this bad?</p>
<p>With public cloud and rapid deployments, dealing with infrastructure at scale, things change quickly. Someone may change the way the code is deployed and inadvertently change the way that application is deployed and give it a public NAT. Now we have what should be a private application on a public network.</p>
<p>-or-</p>
<p>“example.com” has exposed private information. Let’s say “example.com” has an application that is designed to be public and they host through “public.example.com”. A malicious user or program can now take the previously exposed private information and attempt to apply it through this new attack vector.</p>
<p>The point is, just because something at its face may seem secure you need to think about things from every possible angle. It does not mean you should not implement things or delay the implementation of applications. It just means security should be at the forefront of every design that you create and that obscurity does not lead to solid security practices.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techjockey.net/security-through-obscurity/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The Remote Access VPN Battle &#8212; SSL vs IPSec VPN</title>
		<link>https://techjockey.net/the-remote-access-vpn-battle-ssl-vs-ipsec-vpn/</link>
		
		<dc:creator><![CDATA[Jim]]></dc:creator>
		<pubDate>Thu, 12 Oct 2017 14:47:20 +0000</pubDate>
				<category><![CDATA[VPN]]></category>
		<category><![CDATA[Client VPN]]></category>
		<guid isPermaLink="false">https://techjockey.net/?p=2164</guid>

					<description><![CDATA[I&#8217;ve recently posted two articles covering two different VPN connection methods. SSL Remote VPN and IPSec Remote VPN via Cisco ASA security applicance. In the article&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;ve recently posted two articles covering two different VPN connection methods. <a title="Easy Cisco AnyConnect with Cisco ASA" href="https://techjockey.net/easy-cisco-anyconnect-with-cisco-asa/" target="_blank" rel="noopener noreferrer">SSL Remote VPN</a> and<a title="Easy Remote Client VPN Solution with a Cisco ASA" href="https://techjockey.net/easy-remote-client-vpn-solution-with-a-cisco-asa/" target="_blank" rel="noopener noreferrer"> IPSec Remote VPN</a> via Cisco ASA security applicance. In the article I promised I would go thru and do a deteail compare and contrast of them. So Let&#8217;s get start!!</p>



<p>As promised here is the follow up post I mentioned <a title="Easy Remote Client VPN Solution with a Cisco ASA" href="https://techjockey.net/easy-remote-client-vpn-solution-with-a-cisco-asa/" target="_blank" rel="noopener noreferrer">here</a> regarding setting up an Cisco AnyConnect remote access. Luckly the process is very similar to a remote access IPSec tunnel in the previous article with a few exceptions. Lets work through the differences between Cisco AnyConnect and a standard remote access IPSec Client VPN.</p>



<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td><b><strong>Comparison</strong></b></td><td><strong>SSL Remote VPN</strong></td><td><strong>IPSec Remote VPN</strong></td></tr><tr><td><em>Cost</em></td><td>$$&nbsp;per Connection, SSL certificate costs</td><td>Usually none, no SSL certificate costs</td></tr><tr><td><em>Capacity</em></td><td>Seats limited to licensing</td><td>Limited to Crypto Hardware</td></tr><tr><td><em>Performance</em></td><td>SSL with DTLS = Very Fast</td><td>IPsec without NAT-T = fast</td></tr><tr><td><em>Vulnerability</em></td><td>SSL vulnerabilties released frequently</td><td>IPSec requires pre-shared key</td></tr><tr><td><em>Requirements</em></td><td>SSL requires TCP 443, DTLS requires UDP 443</td><td>IPSec requires IP Protcol 50 (ESP) and UDP 500(IKEv1), NAT-T requires UDP 4500</td></tr><tr><td><em>Connection Considerations</em></td><td>SSL requires TCP 443 outbound for clients</td><td>IPSec requires both Layer 3 and Layer 4 protocols</td></tr></tbody></table></figure>



<p>NOTE:<em> The table here is a quick reference when comprising SSL remote VPN with IPSec remote VPN. There are many things to consider when choosing between the two. SSL VPN is newer than IPSec, however the answer on which is better is not so straight forward. </em></p>



<p><strong>IPSec remote VPN</strong> utilizes a variety of protocols and ports to form a successful tunnel. If you remember from my article on <a title="What is an IPsec Site-to-Site VPN?" href="https://techjockey.net/site-to-site-ipsec-vpn-using-openswan-and-cisco-asa-9-13/" target="_blank" rel="noopener noreferrer">IPSec</a> and <a title="What is IPsec NAT-Traversal??" href="https://techjockey.net/nat-traversal-ipsec/" target="_blank" rel="noopener noreferrer">NAT-Traversal</a>, port requirements are UDP 500 for IKEv1 exchange, IP Protocol 50 for ESP communication, and if negotiated UDP 4500 for NAT-T. Most of the time these ports and protocols will not be allowed access outbound to the Internet. For instance, many guest networks like hotels and conferences only allow web browsable ports, such as 80(HTTP) and 443(HTTPS) outbound. That is a lot of firewall exceptions to establish an IPSec remote VPN.</p>



<p><strong>SSL remote VPN</strong> introduces many connection and scalability improvements, making remote VPN functionality easier for the end user. SSL remote VPN solves the IPSec issues of a opening ports to establish a VPN session. Remote users no longer connect differently depending on where they are nor do they need to know how they are connected to the Internet, no fancy ports need to be opened, no issues with NAT-Traversal, etc. SSL remote VPN uses a very common trusted port for communication TCP 443 (and UDP 443, more on that later). This port is 99% of the time open to communicate with the Internet web sites. Using a commonly allowed port eliminates the issues seen with IPSec when establishing a VPN.</p>



<p><strong>The trade-off</strong>, SSL remote VPN communicates via SSL/TLS. As stated this requires TCP, which is a stateful transport protocol. The issue arises when you have a remote host operating an application that uses TCP as well, such as web browser or Remote Desktop Connection. The scenario is now TCP on top of TCP, resulting in heavy overhead. Imaging the following scenario, you have a SSL remote VPN host connected, they then open a RDP session to a server on your network. So far so good. Now what happens when either the RDP session or the SSL remote VPN session requires a re-transmission because of connectivity problems. TCP re-transmission storms. Both the VPN session and RDP session will require re-transmissions, generating heavy overhead. Now this is not to say that either session will not recover, cause they will unless the connection is completely severed, TCP will do its job. <a href="http://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security" target="_blank" rel="noopener noreferrer">Datagram Transport Layer Security(DTLS) to the rescue!!!</a></p>



<h4><em><strong>Datagram Transport Layer Security (DTLS)</strong></em></h4>



<p>DTLS is the savior and its what makes SSL client VPNs a very competitive remote access VPN technology. DTLS was designed to secure traffic similar to TLS, but without having to rely so heavily on the underlying TCP transport. TLS relies on TCP to guarantee delivery in the event of message fragmentation, message reordering, and message loss. So getting ride of any one of those TCP features will break the TLS crypto logic.&nbsp; DTLS solution to these issues is as follows:</p>



<ul><li><strong>Message Fragmentation</strong> &#8212; Fragmentation occurs when a packet datagram is too large to fit within an MTU (usually 1500bytes&#8217;ish). Fragmentation is detected and handled by the transport technology (TCP/UDP). TCP has mechanisms built in to solve this while UDP does not. DTLS solves this issue by introducing its own fragmentation offset and length value in the DTLS message itself. This ensure that both ends of the communication are provided fragmentation information regardless of the underlying transport.</li><li><strong>Message Reordering</strong> &#8212; Reordering occurs for several reasons, a common reason is delayed delivery of the underlying network. Reordering isn&#8217;t a huge issue for transport technologies like TCP because it uses sequence numbering to ensure the original data is reassembled properly. TLS requires the sequential delivery of packets to preform it&#8217;s crypto logic, meaning TLS needs the previous packet to be able to decrypt the next packet N+1. DTLS solves this by adding it&#8217;s own sequence numbering to the application, allowing it to not be dependent on the underlying transport technology.</li><li><strong>Message Loss</strong> &#8212; Packet loss occurs when a packet in a data stream never reaches its destination in a certain period of time. Message loss is handled very similar to Message Recording. For TLS and it&#8217;s TCP transport, re-transmissions are triggered for lost packets when sequence numbering doesn&#8217;t compute correctly for a agreed upon window. DTLS fixes this by adding a simple re-transmission timer to it&#8217;s application logic, thereby allowing it to re-transmit packets without relying on the transport protocol.</li></ul>



<p>Keep in mind that DTLS built-in functionality of these usually transport specific recovery mechanisms creates the need for additional RAM/memory on the server-side. Another cool fact is most of these &#8220;fixes&#8221; come from IPSec ESP technology! See<a href="https://tools.ietf.org/html/rfc4347#page-4"> RFC4347</a> for more information.</p>



<h6><em><strong>Helpful links:</strong></em></h6>



<ul><li><a href="https://tools.ietf.org/html/rfc4347#page-4">https://tools.ietf.org/html/rfc4347#page-4</a></li><li><a href="https://security.stackexchange.com/questions/29172/what-changed-between-tls-and-dtls">https://security.stackexchange.com/questions/29172/what-changed-between-tls-and-dtls</a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Apt-Get HTTP Proxy &#8212;  One-Liner</title>
		<link>https://techjockey.net/apt-get-http-proxy-one-liner/</link>
					<comments>https://techjockey.net/apt-get-http-proxy-one-liner/#respond</comments>
		
		<dc:creator><![CDATA[Jim]]></dc:creator>
		<pubDate>Wed, 11 Oct 2017 19:25:05 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://techjockey.net/?p=2442</guid>

					<description><![CDATA[I have a few Debian servers that are behind a firewall and they don&#8217;t have direct access to the internet. &#8220;Protected Servers&#8221;.  I occasionally have to&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>I have a few Debian servers that are behind a firewall and they don&#8217;t have direct access to the internet. &#8220;Protected Servers&#8221;.  I occasionally have to update their packages via a web proxy in the DMZ. I know there a countless ways to do this, but I wanted a one-liner that i can use without having to modify the apt-get application or my hosts default proxy settings.</p>
<p>Hope this helps someone else, cheers!</p>
<pre class="EnlighterJSRAW">http_proxy="http://172.16.0.5:3128" apt-get update</pre>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techjockey.net/apt-get-http-proxy-one-liner/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PAC File and Web Proxy Auto-Configuration (WPAD) HowTo</title>
		<link>https://techjockey.net/clientwebproxyautoconfiguration/</link>
		
		<dc:creator><![CDATA[Jim]]></dc:creator>
		<pubDate>Wed, 11 Oct 2017 18:44:16 +0000</pubDate>
				<category><![CDATA[Proxy]]></category>
		<category><![CDATA[proxy]]></category>
		<guid isPermaLink="false">https://techjockey.net/?p=1157</guid>

					<description><![CDATA[Hello! I posted an article a while back on how to use a web proxy to block unwanted content. While this is good and fun, we&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>Hello! I posted an article a while back on <a title="Squid 3.1 Caching Proxy with SSL" href="https://techjockey.net/squid-3-1-caching-proxy-with-ssl/" target="_blank" rel="noopener noreferrer">how to use a web proxy to block unwanted content</a>. While this is good and fun, we need an easy way to configure clients to use the proxy. For this article I will be over both PAC file deployments and WPAD deployments. We will use the example proxy server <strong>of 172.16.0.5:3128</strong>. Let&#8217;s go!</p>
<p>First a few common ways clients are configured to use a Web Proxy:</p>
<ul>
<li><span style="line-height: 13px;"><strong>Manual configuration</strong> &#8212; Client manually inputs configuration data into each of their browsers to use the web proxy for each protocol (HTTP, HTTPS, FTP, etc).</span></li>
<li><strong>PAC File &#8211;</strong>&#8211; A PAC(Proxy Auto-configuration) file, is a method where the client&#8217;s browser is configured with the location of the PAC file via http:// or https:// to be downloaded automatically .</li>
<li><strong>WPAD</strong> &#8212; WPAD (Web Proxy Automatic Detection) is the automatic and transparent configuration of client&#8217;s to use and send their web-traffic to a proxy server. This deployment of PAC files using already existing network protocols such as DNS or DHCP options.</li>
<li><strong>GPO</strong> &#8212; GPO( Group Policy Objects deployments are primarily used in Windows Domain environments. User will obtain proxy configuration automatically through these Group Policy Objects upon log-in. (not-covered in this article)</li>
</ul>
<p><span id="more-1157"></span></p>
<h3>The PAC File</h3>
<p>A PAC file is nothing more than a text file containing javascript like information regarding where a client&#8217;s browser should or should not send web traffic to the proxy. This is helpful to be able to be selective on which destinations or sources a client should send or not send to a proxy server. For example, if you have internal web sites or resources that should not be proxied you can define those conditions in the PAC file.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">function FindProxyForURL(url, host) {
        if (shExpMatch(host, "*.example.local")) {
                return "DIRECT";
        }

        if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
            isInNet(dnsResolve(host), "172.16.0.0",  "255.240.0.0") ||
            isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
            isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0")) {
                return "DIRECT";
        }
        if (isInNet(host,"192.168.0.0", "255.255.0.0") ||
            isInNet(host,"172.16.0.0", "255.255.240.0") ||
            isInNet(host,"10.0.0.0", "255.0.0.0")) {
                return "DIRECT";
        }

    return "PROXY 172.16.0.5:3128";

}</pre>
<p>&nbsp;<br />
<strong style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;"><br />
return {value}</strong><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;"> = is a key function that will send the web request to either, DIRECT &#8211; for direction connections, or to PROXY &#8212; a proxy server</span></p>
<p><strong>shExpMatch({host | url}, {expression to match})</strong> = An expression function that will match the host entered to an expression. Returns TRUE if a match is found, else returned FALSE.<br />
<strong>host</strong> = the FQDN typed into the User&#8217;s browser. <em>Ex.</em> <em>youtube.com</em><br />
<strong>&#8212; url</strong> = the complete URL typed into the User&#8217;s browser. <em>Ex. http://youtube.com/video</em><br />
<strong>&#8212; isInNet({IP address}, {Network, Netmask}</strong> = isInNet will return TRUE if the supplied host (see above) resolves to an IP address within a subnet, else it will return FALSE.<br />
<strong>dnsResolve({hostname})</strong> = Use to resovle hostnames to IP addresses.</p>
<p>For a<strong> List of PAC Functions</strong>, please visit <a href="http://findproxyforurl.com/pac-functions/">http://findproxyforurl.com/pac-functions/</a></p>
<h3>PAC File Deployments</h3>
<p>A PAC file deployment requires a working PACs file, a server to host the file, and to have the User&#8217;s browser proxy settings configured to find the file. Using Firefox as the example and assuming the filename<strong> proxy.pac</strong> is hosted on <strong>http://host.example.local/proxy.pac</strong>, it would be:</p>
<p><strong>Firefox:</strong></p>
<p><a href="https://techjockey.net/wp-content/uploads/pac-firefox.png"><img loading="lazy" class="alignnone wp-image-3260" src="https://techjockey.net/wp-content/uploads/pac-firefox-300x296.png" alt="" width="450" height="444" srcset="https://techjockey.net/wp-content/uploads/pac-firefox-300x296.png 300w, https://techjockey.net/wp-content/uploads/pac-firefox.png 731w" sizes="(max-width: 450px) 100vw, 450px" /></a></p>
<p><strong>Internet Explorer:</strong></p>
<p><a href="https://techjockey.net/wp-content/uploads/pac-ie.png"><img loading="lazy" class="alignnone wp-image-3262" src="https://techjockey.net/wp-content/uploads/pac-ie-233x300.png" alt="" width="450" height="579" srcset="https://techjockey.net/wp-content/uploads/pac-ie-233x300.png 233w, https://techjockey.net/wp-content/uploads/pac-ie.png 416w" sizes="(max-width: 450px) 100vw, 450px" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>WPAD Deployments (DNS and DHCP)</h3>
<p>Much of the Web Proxy Automatic Detection (WPAD) type deployments depend on the client&#8217;s browsers implementation, meaning it really depends on how the browser WPAD code was written into the browser application. For example Firefox WPAD process may be different for Safari then it is for Internet Explorer&#8217;s. For the most browsers the process is as follows for both types DNS or DHCP:</p>
<h6><strong>DNS Option</strong></h6>
<ol>
<li>User&#8217;s Browser checks if Auto-Detect is enabled.<br />
<strong>Firefox:<br />
<a href="https://techjockey.net/wp-content/uploads/Firefox-auto-detect.png"><img loading="lazy" class="alignnone wp-image-3264" src="https://techjockey.net/wp-content/uploads/Firefox-auto-detect-300x90.png" alt="" width="450" height="134" srcset="https://techjockey.net/wp-content/uploads/Firefox-auto-detect-300x90.png 300w, https://techjockey.net/wp-content/uploads/Firefox-auto-detect.png 687w" sizes="(max-width: 450px) 100vw, 450px" /></a><br />
</strong><br />
<strong>Internet Explorer:</strong><br />
<a href="https://techjockey.net/wp-content/uploads/IE-auto-detect.png"><img loading="lazy" class="alignnone wp-image-3265" src="https://techjockey.net/wp-content/uploads/IE-auto-detect-300x232.png" alt="" width="450" height="349" srcset="https://techjockey.net/wp-content/uploads/IE-auto-detect-300x232.png 300w, https://techjockey.net/wp-content/uploads/IE-auto-detect.png 395w" sizes="(max-width: 450px) 100vw, 450px" /></a></li>
<li>User&#8217;s browser tries to resolve A record of <strong>wpad</strong> using the default domain suffix of the host belongs to (example.local)
<ol>
<li>Tries <strong>wpad.subdomain.example.local</strong></li>
<li>Tries <strong>wpad.example.local</strong></li>
<li>Tries <strong>wpad.local</strong></li>
<li>Tries<strong> wpad.</strong></li>
</ol>
</li>
<li>On first resolve it the User&#8217;s browser will then try to make a HTTP request for against the URL for a file named <strong>wpad.dat</strong><br />
<strong>http://wpad.subdomain.example.local/wpad.dat</strong></li>
<li>The file is retrieved and loaded into the User&#8217;s browser session!</li>
</ol>
<h6>DHCP Option 252</h6>
<p>DHCP method requires configuration of the DHCP scope that your User&#8217;s will use. A specific DHCP option, option 252 text string is used for this. On your DHCP server, find the scope your Users will be assigned an IP address from and add the<strong> DHCP option 252</strong> as a type string. The string value should be the URL to reach the PAC file. For example,</p>
<p><strong>Microsoft DHCP:</strong></p>
<p><a href="https://techjockey.net/wp-content/uploads/DHCP-option252.png"><img loading="lazy" class="alignnone wp-image-3267" src="https://techjockey.net/wp-content/uploads/DHCP-option252-281x300.png" alt="" width="450" height="481" srcset="https://techjockey.net/wp-content/uploads/DHCP-option252-281x300.png 281w, https://techjockey.net/wp-content/uploads/DHCP-option252.png 412w" sizes="(max-width: 450px) 100vw, 450px" /></a></p>
<p><strong>Other helpful links:</strong></p>
<ul>
<li><a href="http://wiki.squid-cache.org/Technology/WPAD">http://wiki.squid-cache.org/Technology/WPAD</a></li>
<li><a href="http://wiki.squid-cache.org/Technology/WPAD/DNS">http://wiki.squid-cache.org/Technology/WPAD/DNS</a></li>
<li><a href="http://support.microsoft.com/kb/934864">http://support.microsoft.com/kb/934864</a></li>
<li><a href="http://wiki.squid-cache.org/Technology/WPAD">http://wiki.squid-cache.org/Technology/WPAD</a></li>
<li><a href="http://techlib.barracuda.com/display/WSFLEXv41/How+to+Configure+Proxy+Settings+Using+PAC+Files+and+WPAD">http://techlib.barracuda.com/display/WSFLEXv41/How+to+Configure+Proxy+Settings+Using+PAC+Files+and+WPAD</a></li>
<li><a href="https://mikewest.org/2007/01/auto-configuring-proxy-settings-with-a-pac-file">https://mikewest.org/2007/01/auto-configuring-proxy-settings-with-a-pac-file</a></li>
<li><a href="http://technet.microsoft.com/en-us/library/cc995158.aspx">http://technet.microsoft.com/en-us/library/cc995158.aspx</a></li>
<li><a href="http://findproxyforurl.com/troubleshooting-pac-wpad/">http://findproxyforurl.com/troubleshooting-pac-wpad/</a></li>
<li><a href="https://www.cisco.com/c/en/us/td/docs/security/web_security/connector/connector3000/WPADAP.html">https://www.cisco.com/c/en/us/td/docs/security/web_security/connector/connector3000/WPADAP.html</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Smart Mirror Project</title>
		<link>https://techjockey.net/smart-mirror-project/</link>
					<comments>https://techjockey.net/smart-mirror-project/#comments</comments>
		
		<dc:creator><![CDATA[Jim]]></dc:creator>
		<pubDate>Mon, 02 May 2016 03:41:43 +0000</pubDate>
				<category><![CDATA[Other Projects]]></category>
		<guid isPermaLink="false">https://techjockey.net/?p=2928</guid>

					<description><![CDATA[Like many of you I tend to browse Imgur from time to time. I noticed a few times some folks were showing off their build of a&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>Like many of you I tend to browse Imgur from time to time. I noticed a few times some folks were showing off their build of a Smart Mirror and I thought to myself that would make a great thejimmahknows post! So here we go!</p>
<p><a href="https://techjockey.net/wp-content/uploads/smartmirrorgif-compressor.gif" target="_blank" rel="noopener"><img loading="lazy" class="aligncenter wp-image-3201 size-full" src="https://techjockey.net/wp-content/uploads/smartmirrorgif-compressor.gif" alt="" width="309" height="495" /></a></p>
<p>&nbsp;</p>
<ol>
<li>
<h5>Supplies:</h5>
<ul>
<li style="list-style-type: none;">
<ul>
<li>Furring Wood &#8212; <a href="http://s6.postimg.org/ffafl7ow1/image.jpg">This will be used as our frame&#8217;s trim and mirror.</a></li>
<li>Whitewood &#8212; <a href="http://s6.postimg.org/ffafl7ow1/image.jpg">This will be used to frame our box.</a></li>
<li>Perforated Hardboard &#8212; <a href="http://s6.postimg.org/o7re8wa0x/image.jpg">Used on the back of our Smart Mirror.</a></li>
<li>Wood Glue &#8212; <a href="http://www.homedepot.com/p/Elmer-s-8-oz-Carpenter-s-Wood-Glue-E7010/202819835">This will be used to tie the Frame and Furring Trim together. </a></li>
<li>Clutch clamps &#8212; <a href="http://www.homedepot.com/p/BESSEY-24-in-Clutch-Style-Bar-Clamp-with-Composite-Plastic-Handle-and-3-1-2-in-Throat-Depth-GSCC3-524-2K/204986202">I had 3 of these at my disposal, I highly recommend having at least to two(2).</a></li>
<li>Two-way Mirrored Acrylic Sheets&#8211; <a href="http://www.tapplastics.com/product/plastics/cut_to_size_plastic/two_way_mirrored_acrylic/558">I went with 3/16th and the dimensions of the TV.</a></li>
<li>Raspberry Pi &#8212; <a href="http://www.amazon.com/CanaKit-Raspberry-Complete-Starter-WiFi/dp/B017AL0NF8/ref=sr_1_11?ie=UTF8&amp;qid=1462144777&amp;sr=8-11&amp;keywords=canakit">The brains of this operation!</a></li>
<li>Monitor/TV &#8212; Choose one to meet your needs. Mine goal was to fine a cheap LED 32in monitor/TV. I settled with a <a href="http://www.bestbuy.com/site/sharp-32-class-31-5-diag--led-1080p-hdtv-black/2351018.p?id=1219539712119&amp;skuId=2351018">Sharp LC-32LB370U (32&#8243; LED TV)</a></li>
<li>Optional: Nail Set &#8212; <a href="http://www.homedepot.com/p/Dasco-Pro-Nail-Setter-Kit-3-Piece-77-2/100653518">Use this to nail in the trim, I already had one of these.</a></li>
<li>Optional: Finishing Nails &#8212; <a href="http://s6.postimg.org/rkzmvm3lt/image.jpg">Just a little extra to tie the Frame and Trim together.</a></li>
</ul>
</li>
</ul>
<p><span id="more-2928"></span></p>
<ul>
<li style="text-align: left;">Some Shopping Pictures<br />
<a href="https://techjockey.net/wp-content/uploads/2-scaled.jpg" target="_blank" rel="noopener"><img loading="lazy" class="alignnone wp-image-3207 size-medium" src="https://techjockey.net/wp-content/uploads/2-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/2-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/2-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/2-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/2-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/2-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/2-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a> <a href="https://techjockey.net/wp-content/uploads/3-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3208 size-medium" src="https://techjockey.net/wp-content/uploads/3-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/3-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/3-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/3-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/3-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/3-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/3-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a> <a href="https://techjockey.net/wp-content/uploads/4-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3209 size-medium" src="https://techjockey.net/wp-content/uploads/4-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/4-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/4-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/4-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/4-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/4-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/4-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a></li>
</ul>
</li>
<li>
<h5>Sizing:</h5>
<ul>
<li>Remove the bezel from the monitor/TV to get the correct sizing. Below is the Sharp TV bezel removal..<br />
<a href="https://techjockey.net/wp-content/uploads/37-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3212 size-medium" src="https://techjockey.net/wp-content/uploads/37-300x169.jpg" alt="" width="300" height="169" srcset="https://techjockey.net/wp-content/uploads/37-300x169.jpg 300w, https://techjockey.net/wp-content/uploads/37-1024x576.jpg 1024w, https://techjockey.net/wp-content/uploads/37-768x432.jpg 768w, https://techjockey.net/wp-content/uploads/37-1536x864.jpg 1536w, https://techjockey.net/wp-content/uploads/37-2048x1152.jpg 2048w" sizes="(max-width: 300px) 100vw, 300px" /></a><a href="https://techjockey.net/wp-content/uploads/34-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3213 size-medium" src="https://techjockey.net/wp-content/uploads/34-300x169.jpg" alt="" width="300" height="169" srcset="https://techjockey.net/wp-content/uploads/34-300x169.jpg 300w, https://techjockey.net/wp-content/uploads/34-1024x576.jpg 1024w, https://techjockey.net/wp-content/uploads/34-768x432.jpg 768w, https://techjockey.net/wp-content/uploads/34-1536x864.jpg 1536w, https://techjockey.net/wp-content/uploads/34-2048x1152.jpg 2048w" sizes="(max-width: 300px) 100vw, 300px" /></a><a href="https://techjockey.net/wp-content/uploads/36-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3211 size-medium" src="https://techjockey.net/wp-content/uploads/36-300x169.jpg" alt="" width="300" height="169" srcset="https://techjockey.net/wp-content/uploads/36-300x169.jpg 300w, https://techjockey.net/wp-content/uploads/36-1024x576.jpg 1024w, https://techjockey.net/wp-content/uploads/36-768x432.jpg 768w, https://techjockey.net/wp-content/uploads/36-1536x864.jpg 1536w, https://techjockey.net/wp-content/uploads/36-2048x1152.jpg 2048w" sizes="(max-width: 300px) 100vw, 300px" /></a>  <a href="https://techjockey.net/wp-content/uploads/35-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3214 size-medium" src="https://techjockey.net/wp-content/uploads/35-300x169.jpg" alt="" width="300" height="169" srcset="https://techjockey.net/wp-content/uploads/35-300x169.jpg 300w, https://techjockey.net/wp-content/uploads/35-1024x576.jpg 1024w, https://techjockey.net/wp-content/uploads/35-768x432.jpg 768w, https://techjockey.net/wp-content/uploads/35-1536x864.jpg 1536w, https://techjockey.net/wp-content/uploads/35-2048x1152.jpg 2048w" sizes="(max-width: 300px) 100vw, 300px" /></a></li>
<li>I also removed the speakers in the last picture in an effort to reduce the TV&#8217;s max width.</li>
<li>I measured this TV as 12 inches by 28 inches</li>
</ul>
</li>
<li>
<h5>Framing</h5>
<ul>
<li>Accounting for the sizing obtained in the previous step. I added 3/8 inch to the overall dimensions.</li>
<li>Cut the pieces appropriately and glued w/screws to hold the frame together as show below&#8230;<br />
<a href="https://techjockey.net/wp-content/uploads/6-scaled.jpg"><img loading="lazy" class="alignnone size-medium wp-image-3218" src="https://techjockey.net/wp-content/uploads/6-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/6-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/6-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/6-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/6-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/6-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/6-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a> <img loading="lazy" class="alignnone size-medium wp-image-3219" src="https://techjockey.net/wp-content/uploads/5-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/5-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/5-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/5-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/5-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/5-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/5-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></li>
<li>I also covered the screw holes using a little Wood Fill Puddy to hide them.<br />
<a href="https://techjockey.net/wp-content/uploads/7-scaled.jpg"><img loading="lazy" class="alignnone size-medium wp-image-3220" src="https://techjockey.net/wp-content/uploads/7-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/7-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/7-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/7-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/7-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/7-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/7-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a> <a href="https://techjockey.net/wp-content/uploads/8-scaled.jpg"><img loading="lazy" class="alignnone size-medium wp-image-3221" src="https://techjockey.net/wp-content/uploads/8-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/8-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/8-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/8-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/8-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/8-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/8-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a></li>
<li>After it dries, use sandpaper to smooth it out. I went 80 to 120 grit.</li>
</ul>
</li>
<li>
<h5>The Trim</h5>
<ul>
<li>Start the Trim process by using the dimension of the frame you created in the previous step. Account for an approxmet overhang of 1 inch of inside frame.</li>
<li>Use a <a href="https://en.wikipedia.org/wiki/Miter_saw">miter saw</a> to cut the 45 degree angles and using glue anchor it to the frame.</li>
<li>I would recommend starting with the top pieces of trim..One at a time!!<br />
<a href="https://techjockey.net/wp-content/uploads/9-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3225 size-medium" src="https://techjockey.net/wp-content/uploads/9-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/9-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/9-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/9-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/9-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/9-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/9-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a>  and then the bottom one&#8230;<a href="https://techjockey.net/wp-content/uploads/10-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3224 size-medium" src="https://techjockey.net/wp-content/uploads/10-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/10-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/10-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/10-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/10-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/10-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/10-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a></li>
<li>After the top and bottom pieces have finished glue. Move on to the side pieces. Depending on how straight the furring wood is or if its contorted, re-measure before cutting the side pieces so they fit.<br />
<a href="https://techjockey.net/wp-content/uploads/12-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3227 size-medium" src="https://techjockey.net/wp-content/uploads/12-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/12-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/12-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/12-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/12-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/12-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/12-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a>    left and then right, i think&#8230;.<a href="https://techjockey.net/wp-content/uploads/14-scaled.jpg"><img loading="lazy" class="alignnone size-medium wp-image-3226" src="https://techjockey.net/wp-content/uploads/14-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/14-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/14-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/14-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/14-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/14-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/14-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a></li>
<li>I added some finishing nails for extra holding strength. Use a speed square to set your nails to compensate for the trims overhang.<br />
<a href="https://techjockey.net/wp-content/uploads/16-scaled.jpg"><img loading="lazy" class="alignnone size-medium wp-image-3230" src="https://techjockey.net/wp-content/uploads/16-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/16-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/16-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/16-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/16-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/16-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/16-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a>                                                 <img loading="lazy" class="alignnone size-medium wp-image-3229" src="https://techjockey.net/wp-content/uploads/17-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/17-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/17-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/17-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/17-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/17-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/17-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></li>
<li><strong>Finished Frame and Trim</strong><br />
<a href="https://techjockey.net/wp-content/uploads/18-scaled.jpg"><img loading="lazy" class="alignnone size-large wp-image-3233" src="https://techjockey.net/wp-content/uploads/18-576x1024.jpg" alt="" width="576" height="1024" srcset="https://techjockey.net/wp-content/uploads/18-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/18-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/18-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/18-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/18-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/18-scaled.jpg 1440w" sizes="(max-width: 576px) 100vw, 576px" /></a></li>
</ul>
</li>
<li>
<h5>The Stand</h5>
<ul>
<li>A pretty simple design, using some of the spare Whiteboard pieces from the frame construction I cut at 45s to make the supports.</li>
<li>I chose to use threaded bolts with wing nuts to easily convert it and hang it directly on the wall.<br />
<a href="https://techjockey.net/wp-content/uploads/20-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3236 size-large" src="https://techjockey.net/wp-content/uploads/20-1024x576.jpg" alt="" width="1024" height="576" srcset="https://techjockey.net/wp-content/uploads/20-1024x576.jpg 1024w, https://techjockey.net/wp-content/uploads/20-300x169.jpg 300w, https://techjockey.net/wp-content/uploads/20-768x432.jpg 768w, https://techjockey.net/wp-content/uploads/20-1536x864.jpg 1536w, https://techjockey.net/wp-content/uploads/20-2048x1152.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></li>
<li>Lastly I used some scrape plywood or MDF board to cut the base. The base size will depend on how tall and heavy you make yours!!<br />
<a href="https://techjockey.net/wp-content/uploads/21-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3237 size-large" src="https://techjockey.net/wp-content/uploads/21-576x1024.jpg" alt="" width="576" height="1024" srcset="https://techjockey.net/wp-content/uploads/21-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/21-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/21-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/21-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/21-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/21-scaled.jpg 1440w" sizes="(max-width: 576px) 100vw, 576px" /></a></li>
<li>A little 2&#215;4 to secure it and we are done with this part!</li>
</ul>
</li>
<li>
<h5>Time for some Stain!</h5>
<ul>
<li>Choose whatever color stain you want and I recommend doing this with gloves and outside!!<br />
<a href="https://techjockey.net/wp-content/uploads/22-scaled.jpg"><img loading="lazy" class="alignnone size-medium wp-image-3239" src="https://techjockey.net/wp-content/uploads/22-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/22-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/22-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/22-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/22-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/22-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/22-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a><img loading="lazy" class="alignnone size-medium wp-image-3238" src="https://techjockey.net/wp-content/uploads/23-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/23-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/23-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/23-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/23-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/23-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/23-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /> <a href="https://techjockey.net/wp-content/uploads/25-scaled.jpg"><img loading="lazy" class="alignnone size-medium wp-image-3240" src="https://techjockey.net/wp-content/uploads/25-169x300.jpg" alt="" width="169" height="300" srcset="https://techjockey.net/wp-content/uploads/25-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/25-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/25-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/25-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/25-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/25-scaled.jpg 1440w" sizes="(max-width: 169px) 100vw, 169px" /></a></li>
</ul>
</li>
<li>
<h5>Putting the stand together</h5>
<ul>
<li>I decided to drill a 1.25&#8243; hole at the bottom of the the frame for future use. If I ever want to hang the frame I can easily re-route the wires through this hole and out the bottom.<br />
<a href="https://techjockey.net/wp-content/uploads/24-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3244" src="https://techjockey.net/wp-content/uploads/24-169x300.jpg" alt="" width="320" height="568" srcset="https://techjockey.net/wp-content/uploads/24-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/24-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/24-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/24-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/24-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/24-scaled.jpg 1440w" sizes="(max-width: 320px) 100vw, 320px" /></a></li>
<li>Putting the Stand and Frame together, using the threaded bolts and wing nuts, make assembling it fast.<br />
<a href="https://techjockey.net/wp-content/uploads/26-scaled.jpg"><img loading="lazy" class="alignnone  wp-image-3242" src="https://techjockey.net/wp-content/uploads/26-169x300.jpg" alt="" width="320" height="568" srcset="https://techjockey.net/wp-content/uploads/26-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/26-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/26-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/26-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/26-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/26-scaled.jpg 1440w" sizes="(max-width: 320px) 100vw, 320px" /></a> <a href="https://techjockey.net/wp-content/uploads/25-1-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3243" src="https://techjockey.net/wp-content/uploads/25-1-169x300.jpg" alt="" width="320" height="568" srcset="https://techjockey.net/wp-content/uploads/25-1-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/25-1-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/25-1-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/25-1-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/25-1-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/25-1-scaled.jpg 1440w" sizes="(max-width: 320px) 100vw, 320px" /></a></li>
<li>Drill a small hole behind the trim to route the Infrared sensor for the TV<br />
<a href="https://techjockey.net/wp-content/uploads/28-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3241" src="https://techjockey.net/wp-content/uploads/28-169x300.jpg" alt="" width="320" height="568" srcset="https://techjockey.net/wp-content/uploads/28-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/28-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/28-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/28-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/28-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/28-scaled.jpg 1440w" sizes="(max-width: 320px) 100vw, 320px" /></a></li>
</ul>
</li>
<li>
<h5>Inserting the Mirrored Glass and TV</h5>
<ul>
<li>Use rubber stoppers or something similar prior to inserting the glass into places. I found these at Home Depot for under $3.<br />
<a href="http://s6.postimg.org/c8to6t8ld/image.jpg">  </a> <a href="https://techjockey.net/wp-content/uploads/29-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3246" src="https://techjockey.net/wp-content/uploads/29-169x300.jpg" alt="" width="320" height="568" srcset="https://techjockey.net/wp-content/uploads/29-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/29-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/29-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/29-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/29-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/29-scaled.jpg 1440w" sizes="(max-width: 320px) 100vw, 320px" /></a><a href="https://techjockey.net/wp-content/uploads/30-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3245" src="https://techjockey.net/wp-content/uploads/30-169x300.jpg" alt="" width="320" height="568" srcset="https://techjockey.net/wp-content/uploads/30-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/30-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/30-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/30-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/30-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/30-scaled.jpg 1440w" sizes="(max-width: 320px) 100vw, 320px" /></a> <a href="http://s6.postimg.org/c8to6t8ld/image.jpg"><br />
</a></li>
<li>Insert the Glass in very carefully!!<br />
<a href="https://techjockey.net/wp-content/uploads/32-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3247 size-large" src="https://techjockey.net/wp-content/uploads/32-576x1024.jpg" alt="" width="576" height="1024" srcset="https://techjockey.net/wp-content/uploads/32-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/32-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/32-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/32-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/32-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/32-scaled.jpg 1440w" sizes="(max-width: 576px) 100vw, 576px" /></a></li>
<li>Now lay the TV (without the bezel) on top of the glass)<br />
<a href="https://techjockey.net/wp-content/uploads/40-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3248 size-large" src="https://techjockey.net/wp-content/uploads/40-576x1024.jpg" alt="" width="576" height="1024" srcset="https://techjockey.net/wp-content/uploads/40-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/40-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/40-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/40-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/40-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/40-scaled.jpg 1440w" sizes="(max-width: 576px) 100vw, 576px" /></a></li>
<li>Feed the Infra-red wire through the hole we made in the previous step.<br />
<a href="https://techjockey.net/wp-content/uploads/43-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3249" src="https://techjockey.net/wp-content/uploads/43-169x300.jpg" alt="" width="320" height="568" srcset="https://techjockey.net/wp-content/uploads/43-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/43-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/43-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/43-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/43-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/43-scaled.jpg 1440w" sizes="(max-width: 320px) 100vw, 320px" /></a></li>
<li>Using Velcro strips and some packing tape secure the Raspberry Pi and cabling.<br />
<a href="https://techjockey.net/wp-content/uploads/42-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3250 size-large" src="https://techjockey.net/wp-content/uploads/42-576x1024.jpg" alt="" width="576" height="1024" srcset="https://techjockey.net/wp-content/uploads/42-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/42-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/42-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/42-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/42-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/42-scaled.jpg 1440w" sizes="(max-width: 576px) 100vw, 576px" /></a></li>
</ul>
</li>
<li>
<h5>Adding the back</h5>
<ul>
<li>Using the Perforated Hardboard, cut the back to fit within the frame. And use Drywall screws to lock it in place.<br />
<a href="https://techjockey.net/wp-content/uploads/46-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3253" src="https://techjockey.net/wp-content/uploads/46-169x300.jpg" alt="" width="320" height="568" srcset="https://techjockey.net/wp-content/uploads/46-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/46-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/46-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/46-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/46-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/46-scaled.jpg 1440w" sizes="(max-width: 320px) 100vw, 320px" /></a><a href="https://techjockey.net/wp-content/uploads/45-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3252" src="https://techjockey.net/wp-content/uploads/45-169x300.jpg" alt="" width="320" height="568" srcset="https://techjockey.net/wp-content/uploads/45-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/45-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/45-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/45-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/45-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/45-scaled.jpg 1440w" sizes="(max-width: 320px) 100vw, 320px" /></a></li>
</ul>
</li>
<li>
<h5>Let&#8217;s boot it up!</h5>
<ul>
<li>Please visit <a href="https://www.raspberrypi.org/help/noobs-setup/">https://www.raspberrypi.org/help/noobs-setup/</a> to learn how to setup your Rasberry Pi for the first time.</li>
<li>There really isn&#8217;t much at work here, we wil be running Apache2 a very common web server, tell the Rasberry Pi to launch it at login(which we&#8217;ve set to auto-login), and it will host some custom HTML and CSS to present us with what we want to see behind the mirror.</li>
<li>MichMIch maintains the code with the template on GitHub, grab it here <a href="https://github.com/MichMich/MagicMirror">https://github.com/MichMich/MagicMirror</a></li>
<li>Oh look at the magic!<br />
<a href="https://techjockey.net/wp-content/uploads/49-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3254 size-large" src="https://techjockey.net/wp-content/uploads/49-576x1024.jpg" alt="" width="576" height="1024" srcset="https://techjockey.net/wp-content/uploads/49-576x1024.jpg 576w, https://techjockey.net/wp-content/uploads/49-169x300.jpg 169w, https://techjockey.net/wp-content/uploads/49-768x1365.jpg 768w, https://techjockey.net/wp-content/uploads/49-864x1536.jpg 864w, https://techjockey.net/wp-content/uploads/49-1152x2048.jpg 1152w, https://techjockey.net/wp-content/uploads/49-scaled.jpg 1440w" sizes="(max-width: 576px) 100vw, 576px" /></a></li>
</ul>
</li>
<li>
<h5>The Finished Product</h5>
<ul>
<li>Tada!<br />
<a href="https://techjockey.net/wp-content/uploads/IMG-4818-scaled.jpg"><img loading="lazy" class="alignnone wp-image-3256 size-large" src="https://techjockey.net/wp-content/uploads/IMG-4818-1024x1024.jpg" alt="" width="1024" height="1024" srcset="https://techjockey.net/wp-content/uploads/IMG-4818-1024x1024.jpg 1024w, https://techjockey.net/wp-content/uploads/IMG-4818-300x300.jpg 300w, https://techjockey.net/wp-content/uploads/IMG-4818-150x150.jpg 150w, https://techjockey.net/wp-content/uploads/IMG-4818-768x768.jpg 768w, https://techjockey.net/wp-content/uploads/IMG-4818-1536x1536.jpg 1536w, https://techjockey.net/wp-content/uploads/IMG-4818-2048x2048.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></li>
</ul>
</li>
<li>
<h5>Inspiration (Thank you so much!)</h5>
<ul>
<li><a href="http://michaelteeuw.nl/post/84026273526/and-there-it-is-the-end-result-of-the-magic">http://michaelteeuw.nl/post/84026273526/and-there-it-is-the-end-result-of-the-magic</a></li>
<li><a href="http://blog.dylanjpierce.com/raspberrypi/magicmirror/tutorial/2015/12/27/build-a-magic-mirror.html">http://blog.dylanjpierce.com/raspberrypi/magicmirror/tutorial/2015/12/27/build-a-magic-mirror.html</a></li>
</ul>
</li>
</ol>
<p><!--more--></p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techjockey.net/smart-mirror-project/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Cisco AnyConnect SSL/TLS Trustpoint</title>
		<link>https://techjockey.net/cisco-anyconnect-ssltls-trustpoint/</link>
		
		<dc:creator><![CDATA[Jim]]></dc:creator>
		<pubDate>Mon, 28 Mar 2016 16:48:43 +0000</pubDate>
				<category><![CDATA[Cisco]]></category>
		<category><![CDATA[SSL]]></category>
		<guid isPermaLink="false">https://techjockey.net/?p=749</guid>

					<description><![CDATA[I wanted to put together a quick tutorial for setting up a Cisco ASA &#8211; AnyConnect with SSL/TLS. I&#8217;ve done it a few times and I&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>I wanted to put together a quick tutorial for setting up a <strong>Cisco ASA &#8211; AnyConnect with SSL/TLS</strong>. I&#8217;ve done it a few times and I always have to re-lookup each step and the order in which to do it, so why not make a quick post about it to remember!</p>
<h6>Optional: Destroy Current Trustpoint</h6>
<p>You will have to destroy or clear out the current trustpoint if it already exists. This must be done if you are going to re-generate the key, which is best practice when renewing a Certificate due to expiration or one that has been compromised.</p>
<pre class="EnlighterJSRAW">asa01(conf)# no crypto ca trustpoint oldtrustpoint.trustpoint</pre>
<ul>
<li>It will warn you that it will destroy any certificates within the trustpoint.</li>
</ul>
<h6>Generate a Key</h6>
<p>Here we start with the generation of our key, using <strong>2048 bits</strong>. the key name can be anything you want, but I like call it by the service I will be putting it on, for my case for this tutorial is <strong>accessthejimmahknowscom.key</strong></p>
<pre class="EnlighterJSRAW">asa01(conf)# crypto key generate rsa label accessthejimmahknowscom.key modulus 2048</pre>
<h6>Setting up the trustpoint locale and generate a CSR for submission</h6>
<p class="">    First we need to set up a trustpoint object, with our locale properties, etc</p>
<pre class="EnlighterJSRAW">asa01(conf)# crypto ca trustpoint newtrustpoint.trustpoint
asa01(config-ca-trustpoint)# subject-name CN=access.thejimmahknows.com,O=thejimmahknows,C=US,St=Connecticut,L=Wethersfield
asa01(config-ca-trustpoint)# keypair accessthejimmahknowscom.key
asa01(config-ca-trustpoint)# fqdn access.thejimmahknows.com
asa01(config-ca-trustpoint)# enrollment terminal
asa01(config-ca-trustpoint)# exit
</pre>
<ul>
<li><strong>newtrustpoint.trustpoint &#8212;</strong> The name I gave to this trustpoint which will tie everything together.</li>
<li><strong>subject-name</strong> <strong>&#8212;</strong> This command holds the distinguished name of the Certificate&#8217;s profile, <a href="https://tools.ietf.org/html/rfc3039#section-3.1" target="_blank" rel="noopener noreferrer">see RFC3039</a></li>
<li><strong>keypair &#8212;</strong> This is what key to pair the trustpoint with, we generated this in the previous step.</li>
<li><strong>fqdn &#8212;</strong> This is the main <a href="https://en.wikipedia.org/wiki/Fully_qualified_domain_name" target="_blank" rel="noopener noreferrer">FQDN</a> of our service that will use the trustpoint</li>
<li><strong>enrolment terminal &#8212;</strong> This tells the Cisco ASA to output the CSR (which we will create in the next step) to the terminal screen. Otherwise you will have to SFTP to the ASA and download it.</li>
</ul>
<p><span id="more-749"></span></p>
<h6>Invoke the Cisco ASA to generate a CSR based on our locale and key from the previous step</h6>
<pre class="EnlighterJSRAW">asa01(conf)# crypto ca enroll accessthejimmahknowscom.trustpoint</pre>
<ul>
<li>Answer no to include the device serial number in the subject name, unless your 3rd-party Certificate Authority requires it.</li>
<li>Answer &#8216;yes&#8217; to display the Certificate Request in the Terminal (makes things easier for submission)</li>
<li>Copy this Certificate Signing Request (CSR) and paste it into your 3rd-party Certificate Authority to obtain a valid signed Certificate</li>
</ul>
<h6>Importing your 3rd-Party&#8217;s Chain</h6>
<p>Cisco calls this next step of importing your Certificate Authority&#8217;s chain certificates as authenticating&#8230;I dunno. But we&#8217;ll go with it.</p>
<pre class="EnlighterJSRAW">asa01(conf)# crypto ca authenticate newtrustpoint.trustpoint
asa01(conf)# {paste in Certificate Authority certificate}
</pre>
<ul>
<li>Follow the prompts to successfully import the Certificate Authority&#8217;s certificate chain</li>
</ul>
<h6>Importing your User Certificate (Hint: you got this from your 3rd-Party CA)</h6>
<pre class="EnlighterJSRAW">asa01(conf)# crypto ca import newtrustpoint.trustpoint certificate</pre>
<ul>
<li>You will be prompted to paste in the certificate, do so.</li>
<li>You can either choose&#8230;
<ul>
<li><strong>certificate</strong> &#8212; for a PEM-base64 certificate</li>
<li><strong> pkcs12</strong> &#8212; for a binary certificate type.</li>
</ul>
</li>
</ul>
<h6>Lastly, configure the ASA to use the trustpoint for a service. (Mine is for AnyConnect)</h6>
<pre class="EnlighterJSRAW">asa01(conf)# ssl trust-point accessthejimmahknowscom.trustpoint outside</pre>
<ul>
<li>Here we <strong>active</strong> this trustpoint on our <strong>outside interface</strong>.</li>
</ul>
<h6>Useful commands:</h6>
<ul>
<li><strong>show crypto ca certificates</strong> &#8212; Shows certificates successfully loaded on the Cisco ASA</li>
<li><strong>show crypto ca trustpoint</strong> &#8212; Shows trustpoints installed on the Cisco ASA</li>
</ul>
<p>&nbsp;</p>
<p>Sources:</p>
<ul>
<li><a href="http://www.cisco.com/en/US/products/ps6120/products_configuration_example09186a00808b3cff.shtml" target="_blank" rel="noopener noreferrer">http://www.cisco.com/en/US/products/ps6120/products_configuration_example09186a00808b3cff.shtml</a></li>
<li><a href="http://en.wikipedia.org/wiki/Public-key_infrastructure" target="_blank" rel="noopener noreferrer">http://en.wikipedia.org/wiki/Public-key_infrastructure</a></li>
<li><a href="http://www.firewall.cx/cisco-technical-knowledgebase/cisco-routers/904-cisco-router-anyconnect-webvpn.html" target="_blank" rel="noopener noreferrer">http://www.firewall.cx/cisco-technical-knowledgebase/cisco-routers/904-cisco-router-anyconnect-webvpn.html</a></li>
<li><a href="https://supportforums.cisco.com/discussion/11040111/certificate-export-asa-iis" target="_blank" rel="noopener noreferrer">https://supportforums.cisco.com/discussion/11040111/certificate-export-asa-iis</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>F5 BIGIP and HAProxy &#8212; Masking 2-Way &#8220;Mutual&#8221; SSL Authentication</title>
		<link>https://techjockey.net/masking-2-way-mutual-ssl-authentication-using-f5-ltm-or-haproxy/</link>
					<comments>https://techjockey.net/masking-2-way-mutual-ssl-authentication-using-f5-ltm-or-haproxy/#comments</comments>
		
		<dc:creator><![CDATA[Jim]]></dc:creator>
		<pubDate>Fri, 26 Feb 2016 22:22:48 +0000</pubDate>
				<category><![CDATA[F5]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[F5 LTM]]></category>
		<category><![CDATA[HAProxy]]></category>
		<category><![CDATA[Mutual SSL Authentication]]></category>
		<guid isPermaLink="false">https://techjockey.net/?p=2626</guid>

					<description><![CDATA[Hello folks, So a recent post I published talked about 1-Way vs 2-way SSL Authentication in some decent detail. We learned that 2-Way &#8220;Mutual&#8221; SSL Authentication&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>Hello folks,</p>
<p>So a recent post I published talked about <a href="https://techjockey.net/1-way-vs-2-way-ssl-authentication/">1-Way vs 2-way SSL Authentication</a> in some decent detail. We learned that 2-Way &#8220;Mutual&#8221; SSL Authentication can be used to enforce both parties attempting to communicate securely to provide authenticity. In other words, prove to each other that they are who they say they are. This can be very powerful from a security standpoint, but is it practical? The answer is, yes and no. The constraint comes from the aspect of administration (actually create certificates for each client) and manageability (keep accounting and maintaining actively lists of trusts) with the trade-off of proper authenticity. For example at first administering and managing 10 client certificates may be okay, but then imaging 100, or even a 1,000! So in this post I wanted to approach the idea of utilizing some tools we can use to offload some of this administration and management while maintaining Mutual Authentication with another entity. The idea revolves around one major assumption, users of a particular service (In this case a web-server) reside on a privately controlled and trusted network</p>
<p>My idea is if we have a group of clients residing on an internal privately addressed network, we can use either an F5 LTM or HAProxy to proxy our users&#8217;s connections destined for a service that is enforcing 2-Way SSL &#8220;Mutual&#8221; Authentication. The F5 LTM or HAProxy would perform the 2-Way SSL Mutual Authentication <em>on behalf</em> of each connecting user, eliminating the technical need to generate certificates for each client, while maintaining an element of mutual trust to the end service.</p>
<p><strong>The basic idea is: (notice only our F5 LTM/HAproxy and the web-server perform 2-Way &#8220;Mutual&#8221; Authentication)</strong></p>
<p><a href="https://techjockey.net/wp-content/uploads/diagram1.png"><img loading="lazy" class="alignnone wp-image-3281 size-full" src="https://techjockey.net/wp-content/uploads/diagram1.png" alt="" width="894" height="447" srcset="https://techjockey.net/wp-content/uploads/diagram1.png 894w, https://techjockey.net/wp-content/uploads/diagram1-300x150.png 300w, https://techjockey.net/wp-content/uploads/diagram1-768x384.png 768w" sizes="(max-width: 894px) 100vw, 894px" /></a></p>
<h4></h4>
<p><span id="more-2626"></span></p>
<h3>Preliminary Steps:</h3>
<p>For the following steps please read my <a href="https://techjockey.net/1-way-vs-2-way-ssl-authentication/">1-Way vs 2-Way SSL Authentication Post.</a></p>
<ol>
<li>
<h5>Create a the <strong>web-server&#8217;</strong>s CSR and Key</h5>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Creating Web-Server Key and CSR">root@ca:/opt# openssl req -config openssl-rootca.conf -extensions server_req_ext -new -nodes -newkey rsa:2048 -keyout web-server.key -out web-server.csr -days 365
Generating a 2048 bit RSA private key
................................+++
............................................................................+++
writing new private key to 'web-server2.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Enter Country [US]:
State or Province Name (full name) [Connecticut]:
Locality Name (eg, city) [Wethersfield]:
Organization Name [thejimmahknows]:
Unit Name [Test Unit]:
Common Name (e.g. server FQDN or YOUR name) []:web-server
Contact email for this Certificate [admin@example.com]:
</pre>
<p>&nbsp;</li>
<li>
<h5>Create the F5 &amp; HAproxy <strong>Server-Side</strong> CSR and Key</h5>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Create F5 &amp; HAProxy Client CSR and Key">root@ca:/opt# openssl req -config openssl-rootca.conf -extensions client_req_ext -new -nodes -newkey rsa:2048 -keyout ha-client1.key -out ha-client1.csr -days 365
Generating a 2048 bit RSA private key
...................+++
.....+++
writing new private key to 'ha-client1.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Enter Country [US]:
State or Province Name (full name) [Connecticut]:
Locality Name (eg, city) [Wethersfield]:
Organization Name [thejimmahknows]:
Unit Name [Test Unit]:
Common Name (e.g. server FQDN or YOUR name) []:ha-client1
Contact email for this Certificate [admin@example.com]:
</pre>
<p>&nbsp;</li>
<li>
<h5>Create the F5 &amp; HAproxy <strong>Client-Side</strong> (connection the client will actual connect to)</h5>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Create the client-side CSR and Key">root@ca:/opt# openssl req -config openssl-rootca.conf -extensions server_req_ext -new -nodes -newkey rsa:2048 -keyout virtual-service.key -out virtual-service.csr -days 365
Generating a 2048 bit RSA private key
........................+++
.............................................................+++
writing new private key to 'virtual-service.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Enter Country [US]:
State or Province Name (full name) [Connecticut]:
Locality Name (eg, city) [Wethersfield]:
Organization Name [thejimmahknows]:
Unit Name [Test Unit]:
Common Name (e.g. server FQDN or YOUR name) []:mytestvip
Contact email for this Certificate [admin@example.com]:
</pre>
</li>
<li>
<h5>Using our CA from my previous ariticle, sign all three of these certificates</h5>
<p><strong>Sign the web-server&#8217;s CSR</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Sign web-server CSR">root@ca:/opt# openssl ca -config openssl-rootca.conf -extensions server_req_ext -in web-server2.csr -out web-server2.crt
Using configuration from openssl-rootca.conf
Enter pass phrase for /opt/rootCA.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'US'
stateOrProvinceName   :ASN.1 12:'Connecticut'
localityName          :ASN.1 12:'Wethersfield'
organizationName      :ASN.1 12:'thejimmahknows'
organizationalUnitName:ASN.1 12:'Test Unit'
commonName            :ASN.1 12:'web-server'
Certificate is to be certified until Feb 25 15:10:27 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
</pre>
<p><strong>Sign the F5 &amp; HAProxy Server-Side CSR (This is the connection the F5 makes to our backend pool members)</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Sign the F5 &amp; HAProxy Client-Side CSR">root@ca:/opt# openssl ca -config openssl-rootca.conf -extensions client_req_ext -in ha-client1.csr -out ha-client1.crt
Using configuration from openssl-rootca.conf
Enter pass phrase for /opt/rootCA.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'US'
stateOrProvinceName   :ASN.1 12:'Connecticut'
localityName          :ASN.1 12:'Wethersfield'
organizationName      :ASN.1 12:'thejimmahknows'
organizationalUnitName:ASN.1 12:'Test Unit'
commonName            :ASN.1 12:'ha-client1'
Certificate is to be certified until Feb 25 15:12:16 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
</pre>
<p><strong>Sign the F5 &amp; HAProxy Client-Side CSR (This is the connection our users will connect to, the VIP)</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Sign the F5 &amp; HAProxy Client-Side CSR">root@ca:/opt# openssl ca -config openssl-rootca.conf -extensions server_req_ext -in virtual-service.csr -out virtual-service.crt
Using configuration from openssl-rootca.conf
Enter pass phrase for /opt/rootCA.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'US'
stateOrProvinceName   :ASN.1 12:'Connecticut'
localityName          :ASN.1 12:'Wethersfield'
organizationName      :ASN.1 12:'thejimmahknows'
organizationalUnitName:ASN.1 12:'Test Unit'
commonName            :ASN.1 12:'mytestvip'
Certificate is to be certified until Feb 25 15:15:09 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
</pre>
<p>&nbsp;</li>
<li>
<h5>Configure Apache web-server to enforce the 2-Way &#8220;Mutual&#8221; Authentication</h5>
<p><strong> Apache Config from previous post.</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">root@web-server:/opt# vi /etc/apache2/sites-available/default.conf
Listen 443
&lt;VirtualHost *:443&gt;
        DocumentRoot           "/var/www/"

        SSLEngine               on
        SSLCACertificateFile   /opt/rootCA.crt
        SSLCertificateFile     /opt/web-server.crt
        SSLCertificateKeyFile  /opt/web-server.key
       SSLCARevocationFile    /opt/rootCRL.crl
        SSLStrictSNIVHostCheck on
        SSLVerifyClient        require
        SSLVerifyDepth         1

# Allows PHP to read Certificate info
        SSLOptions +stdEnvVars

        LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        CustomLog "/tmp/access.log" combined
        ErrorLog "/tmp/error.log"

&lt;/VirtualHost&gt;
</pre>
<p><strong>Restart Apache</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">root@web-server:/opt# service apache2 restart</pre>
<p><strong> For Troubleshooting create this index.php file</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="index.php troubleshooting file">&lt;?php
echo "Date       =   " . date('Y-m-d H:i:s') . "&lt;br&gt;";

echo "Client Cert =  " . $_SERVER['SSL_CLIENT_S_DN_CN'] . "&lt;br&gt;";
echo "Server Cert =  " . $_SERVER['SSL_SERVER_S_DN_CN'] . "&lt;br&gt;";
echo "Server Serial =  " . $_SERVER['SSL_SERVER_M_SERIAL'] . "&lt;br&gt;";
?&gt;
</pre>
<p>&nbsp;</li>
</ol>
<h3>Masking with F5 LTM:</h3>
<ol>
<li>
<h5><strong>Importing Certificates</strong></h5>
<p><a href="https://techjockey.net/wp-content/uploads/F5-Import-Certificates.jpg"><img loading="lazy" class="alignnone wp-image-3283 size-full" src="https://techjockey.net/wp-content/uploads/F5-Import-Certificates.jpg" alt="" width="581" height="683" srcset="https://techjockey.net/wp-content/uploads/F5-Import-Certificates.jpg 581w, https://techjockey.net/wp-content/uploads/F5-Import-Certificates-255x300.jpg 255w" sizes="(max-width: 581px) 100vw, 581px" /></a></p>
<p><a href="https://techjockey.net/wp-content/uploads/F5-Import-Cert.jpg"><img loading="lazy" class="alignnone wp-image-3284 size-full" src="https://techjockey.net/wp-content/uploads/F5-Import-Cert.jpg" alt="" width="1200" height="404" srcset="https://techjockey.net/wp-content/uploads/F5-Import-Cert.jpg 1200w, https://techjockey.net/wp-content/uploads/F5-Import-Cert-300x101.jpg 300w, https://techjockey.net/wp-content/uploads/F5-Import-Cert-1024x345.jpg 1024w, https://techjockey.net/wp-content/uploads/F5-Import-Cert-768x259.jpg 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></p>
<ul>
<li><strong>Import virtual-service certificate</strong>
<ul>
<li><a href="https://techjockey.net/wp-content/uploads/import-virtual-service-ssl.png"><img loading="lazy" class="alignnone wp-image-3286" src="https://techjockey.net/wp-content/uploads/import-virtual-service-ssl-300x154.png" alt="" width="600" height="308" srcset="https://techjockey.net/wp-content/uploads/import-virtual-service-ssl-300x154.png 300w, https://techjockey.net/wp-content/uploads/import-virtual-service-ssl.png 707w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
<li><a href="https://techjockey.net/wp-content/uploads/virtual-service-ssl-shown.png"><img loading="lazy" class="alignnone wp-image-3287" src="https://techjockey.net/wp-content/uploads/virtual-service-ssl-shown-300x166.png" alt="" width="600" height="332" srcset="https://techjockey.net/wp-content/uploads/virtual-service-ssl-shown-300x166.png 300w, https://techjockey.net/wp-content/uploads/virtual-service-ssl-shown.png 733w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
<li><a href="https://techjockey.net/wp-content/uploads/Import-virtual-service-cert.png"><img loading="lazy" class="alignnone wp-image-3288" src="https://techjockey.net/wp-content/uploads/Import-virtual-service-cert-300x141.png" alt="" width="600" height="282" srcset="https://techjockey.net/wp-content/uploads/Import-virtual-service-cert-300x141.png 300w, https://techjockey.net/wp-content/uploads/Import-virtual-service-cert.png 453w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
</ul>
</li>
<li><strong>Import ha-client1 certificate</strong>
<ul>
<li>Use the same steps from above.</li>
</ul>
</li>
<li><strong>Import the rootCA certificate (used to authenticate the web-server)</strong>
<ul>
<li>Use the same steps from above.<br />
<a href="https://techjockey.net/wp-content/uploads/Import-my-Root-CA.png"><img loading="lazy" class="alignnone wp-image-3289" src="https://techjockey.net/wp-content/uploads/Import-my-Root-CA-300x152.png" alt="" width="600" height="304" srcset="https://techjockey.net/wp-content/uploads/Import-my-Root-CA-300x152.png 300w, https://techjockey.net/wp-content/uploads/Import-my-Root-CA.png 450w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
</ul>
</li>
<li><strong>All 3 Certificates imported</strong></li>
<li><a href="https://techjockey.net/wp-content/uploads/Import-Completed.jpg"><img loading="lazy" class="alignnone wp-image-3290" src="https://techjockey.net/wp-content/uploads/Import-Completed-300x121.jpg" alt="" width="600" height="242" srcset="https://techjockey.net/wp-content/uploads/Import-Completed-300x121.jpg 300w, https://techjockey.net/wp-content/uploads/Import-Completed-1024x412.jpg 1024w, https://techjockey.net/wp-content/uploads/Import-Completed-768x309.jpg 768w, https://techjockey.net/wp-content/uploads/Import-Completed.jpg 1207w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
</ul>
</li>
<li>
<h5>Create the SSL Profiles</h5>
<ul>
<li><strong>Create the client-side-connection SSL profile</strong>
<ul>
<li><a href="https://techjockey.net/wp-content/uploads/Create-Client-SSLProfile.jpg"><img loading="lazy" class="alignnone wp-image-3291" src="https://techjockey.net/wp-content/uploads/Create-Client-SSLProfile.jpg" alt="" width="600" height="581" srcset="https://techjockey.net/wp-content/uploads/Create-Client-SSLProfile.jpg 605w, https://techjockey.net/wp-content/uploads/Create-Client-SSLProfile-300x291.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
<li><a href="https://techjockey.net/wp-content/uploads/new-client-side-connection.png"><img loading="lazy" class="alignnone wp-image-3292" src="https://techjockey.net/wp-content/uploads/new-client-side-connection-298x300.png" alt="" width="600" height="605" srcset="https://techjockey.net/wp-content/uploads/new-client-side-connection-298x300.png 298w, https://techjockey.net/wp-content/uploads/new-client-side-connection-150x150.png 150w, https://techjockey.net/wp-content/uploads/new-client-side-connection.png 744w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
</ul>
</li>
<li><strong>Create the server-side-connection SSL profile</strong>
<ul>
<li><a href="https://techjockey.net/wp-content/uploads/Create-Server-SSLProfile.jpg"><img loading="lazy" class="alignnone wp-image-3294" src="https://techjockey.net/wp-content/uploads/Create-Server-SSLProfile-300x287.jpg" alt="" width="600" height="574" srcset="https://techjockey.net/wp-content/uploads/Create-Server-SSLProfile-300x287.jpg 300w, https://techjockey.net/wp-content/uploads/Create-Server-SSLProfile.jpg 617w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
<li><a href="https://techjockey.net/wp-content/uploads/server-side-connection-profile1.jpg"><img loading="lazy" class="alignnone wp-image-3295" src="https://techjockey.net/wp-content/uploads/server-side-connection-profile1-264x300.jpg" alt="" width="600" height="681" srcset="https://techjockey.net/wp-content/uploads/server-side-connection-profile1-264x300.jpg 264w, https://techjockey.net/wp-content/uploads/server-side-connection-profile1-902x1024.jpg 902w, https://techjockey.net/wp-content/uploads/server-side-connection-profile1-768x872.jpg 768w, https://techjockey.net/wp-content/uploads/server-side-connection-profile1.jpg 919w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
</ul>
</li>
</ul>
</li>
<li>
<h5>Create the Server Pool</h5>
<ul>
<li><a href="https://techjockey.net/wp-content/uploads/create-f5-pool.jpg"><img loading="lazy" class="alignnone wp-image-3296" src="https://techjockey.net/wp-content/uploads/create-f5-pool-300x294.jpg" alt="" width="600" height="588" srcset="https://techjockey.net/wp-content/uploads/create-f5-pool-300x294.jpg 300w, https://techjockey.net/wp-content/uploads/create-f5-pool.jpg 658w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
<li>Verify Pool Status is GOOD<a href="https://techjockey.net/wp-content/uploads/Pool-status-good.png"><img loading="lazy" class="alignnone wp-image-3297" src="https://techjockey.net/wp-content/uploads/Pool-status-good-300x169.png" alt="" width="600" height="337" srcset="https://techjockey.net/wp-content/uploads/Pool-status-good-300x169.png 300w, https://techjockey.net/wp-content/uploads/Pool-status-good.png 370w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
</ul>
</li>
<li>
<h5>Create the Virtual Server aka VIP</h5>
<ul>
<li><a href="https://techjockey.net/wp-content/uploads/create-vip-general-properties.png"><img loading="lazy" class="alignnone wp-image-3298" src="https://techjockey.net/wp-content/uploads/create-vip-general-properties-232x300.png" alt="" width="600" height="777" srcset="https://techjockey.net/wp-content/uploads/create-vip-general-properties-232x300.png 232w, https://techjockey.net/wp-content/uploads/create-vip-general-properties.png 695w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
<li><a href="https://techjockey.net/wp-content/uploads/create-vip-resources.png"><img loading="lazy" class="alignnone wp-image-3299" src="https://techjockey.net/wp-content/uploads/create-vip-resources-300x167.png" alt="" width="600" height="333" srcset="https://techjockey.net/wp-content/uploads/create-vip-resources-300x167.png 300w, https://techjockey.net/wp-content/uploads/create-vip-resources.png 700w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
<li>Verify VIP (Vritual Server) looks good<br />
<a href="https://techjockey.net/wp-content/uploads/virtual-service-looks-good.png"><img loading="lazy" class="alignnone wp-image-3300" src="https://techjockey.net/wp-content/uploads/virtual-service-looks-good-300x69.png" alt="" width="600" height="139" srcset="https://techjockey.net/wp-content/uploads/virtual-service-looks-good-300x69.png 300w, https://techjockey.net/wp-content/uploads/virtual-service-looks-good-768x178.png 768w, https://techjockey.net/wp-content/uploads/virtual-service-looks-good.png 942w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
</ul>
</li>
<li>
<h5><strong>Test by using Chrome to connect to our virtual-service</strong></h5>
<p><a href="https://techjockey.net/wp-content/uploads/Success-F5.png"><img loading="lazy" class="alignnone wp-image-3301" src="https://techjockey.net/wp-content/uploads/Success-F5-300x138.png" alt="" width="600" height="277" srcset="https://techjockey.net/wp-content/uploads/Success-F5-300x138.png 300w, https://techjockey.net/wp-content/uploads/Success-F5.png 494w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
<li>
<h5>Certificate revocation</h5>
<ul>
<li><strong>Revoke the ha-client1.crt</strong> (The certificate the F5 authenticates with when connecting to the web-server)
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Revoke ha-client.crt">root@ca:/opt# openssl ca -config openssl-rootca.conf -revoke ha-client1.crt -crl_reason keyCompromise
Using configuration from openssl-rootca.conf
Enter pass phrase for /opt/rootCA.key:
Revoking Certificate 1005.
Data Base Updated
</pre>
</li>
<li><strong>Re-generate the CRL</strong>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Re-generate the CRL">root@ca:/opt# openssl ca -config openssl-rootca.conf -gencrl -out rootCRL.crl
Using configuration from openssl-rootca.conf
Enter pass phrase for /opt/rootCA.key:

root@ca:/opt# openssl crl -noout -text -in rootCRL.crl
Certificate Revocation List (CRL):
        Version 2 (0x1)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: /C=US/ST=Connecticut/L=Wethersfield/O=thejimmahknows/OU=Test Unit/CN=MyRootAuthority/emailAddress=admin@example.com
        Last Update: Feb 26 18:42:33 2016 GMT
        Next Update: Mar 27 18:42:33 2016 GMT
        CRL extensions:
            X509v3 Authority Key Identifier: 
                keyid:E3:A6:FD:69:23:0A:25:AF:7B:77:7A:B8:03:0B:B6:8A:CF:F2:B2:B8

            Authority Information Access: 
                CA Issuers - URI:http://ocsp.thejimmahknows.com/rootCA.crt

            X509v3 CRL Number: 
                4100
Revoked Certificates:
    Serial Number: 1003
        Revocation Date: Jan 16 18:55:22 2016 GMT
    Serial Number: 1005
        Revocation Date: Feb 26 18:38:04 2016 GMT
        CRL entry extensions:
            X509v3 CRL Reason Code: 
                Key Compromise
</pre>
<p><strong>Notice the Serial Number 1005 is revoked in the CRL file now.</strong></li>
<li><strong>Replace the rootCRL.crl file on the web-server and restart Apache</strong>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">scp /opt/rootCRL.crl root@web-server:/opt/rootCRL.crl

root@web-server:/opt# service apache2 restart</pre>
</li>
<li><strong>Test using the virtual-service VIP on the F5 again.</strong><br />
<a href="https://techjockey.net/wp-content/uploads/Revoked-Successful.png"><img loading="lazy" class="alignnone wp-image-3303" src="https://techjockey.net/wp-content/uploads/Revoked-Successful-300x197.png" alt="" width="600" height="394" srcset="https://techjockey.net/wp-content/uploads/Revoked-Successful-300x197.png 300w, https://techjockey.net/wp-content/uploads/Revoked-Successful-768x504.png 768w, https://techjockey.net/wp-content/uploads/Revoked-Successful.png 775w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
</ul>
</li>
</ol>
<h3>Masking with HAProxy:</h3>
<p><em>If you are unfamiliar with HAProxy, I recommend checking out my <a href="https://techjockey.net/load-balancing-with-haproxy-1-4/">article on setting up HAProxy</a>. Or my articles on using <a href="https://techjockey.net/the-bigip-f5-alterantive-using-haproxy-and-keepalived-part-1/" target="_blank" rel="noopener noreferrer">HAProxy as a F5 LTM replacement.</a></em></p>
<ol>
<li><strong>Before we being, we have to generate and sign another certificate and key because we revoked the ha-client.crt perviously.</strong>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Re-generate a ha-client CSR and Key">root@ca:/opt# openssl req -config openssl-rootca.conf -extensions client_req_ext -new -nodes -newkey rsa:2048 -keyout ha-client2.key -out ha-client2.csr -days 365
Generating a 2048 bit RSA private key
.+++
....................................+++
writing new private key to 'ha-client2.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Enter Country [US]:
State or Province Name (full name) [Connecticut]:
Locality Name (eg, city) [Wethersfield]:
Organization Name [thejimmahknows]:
Unit Name [Test Unit]:
Common Name (e.g. server FQDN or YOUR name) []:ha-client2
Contact email for this Certificate [admin@example.com]:
</pre>
<p><strong>And Sign it</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Sign the ha-client2 cert">root@ca:/opt# openssl ca -config openssl-rootca.conf -extensions client_req_ext -in ha-client2.csr -out ha-client2.crt
Using configuration from openssl-rootca.conf
Enter pass phrase for /opt/rootCA.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'US'
stateOrProvinceName   :ASN.1 12:'Connecticut'
localityName          :ASN.1 12:'Wethersfield'
organizationName      :ASN.1 12:'thejimmahknows'
organizationalUnitName:ASN.1 12:'Test Unit'
commonName            :ASN.1 12:'ha-client2'
Certificate is to be certified until Feb 25 19:47:40 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
</pre>
</li>
<li><strong>Copy All 3 certificates to our HAProxy server</strong>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Copy certs to HAproxy box">root@ca:/opt# scp virtual-service.* root@172.16.0.44:/opt/
root@ca:/opt# scp ha-client2.* root@172.16.0.44:/opt/
root@ca:/opt# scp rootCA.crt root@172.16.0.44:/opt/</pre>
</li>
<li><strong>We need to chain the virtual-service certificate with the root CA certificate for HAProxy to accept it.</strong> (<a href="https://www.digicert.com/ssl-support/pem-ssl-creation.htm" target="_blank" rel="noopener noreferrer">For help reference this</a>)
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Chaining the virtual-servers pem file">root@test-haproxy:/opt# cat virtual-service.key &gt;&gt; virtual-service-chain.pem
root@test-haproxy:/opt# cat virtual-service.crt &gt;&gt; virtual-service-chain.pem
root@test-haproxy:/opt# cat rootCA.crt &gt;&gt; virtual-service-chain.pem</pre>
<p><strong>And ha-client2</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">root@test-haproxy:/opt# cat ha-client2.key &gt;&gt; ha-client2.pem
root@test-haproxy:/opt# cat ha-client2.crt &gt;&gt; ha-client2.pem 
</pre>
</li>
<li><strong> Edit your haproxy.conf file to match</strong>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="haproxy.conf">global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin
        stats timeout 30s
       user haproxy
       group haproxy
        daemon

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # Default ciphers to use on SSL-enabled listening sockets.
        # For more information, see ciphers(1SSL). This list is from:
        #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
        ssl-default-bind-options no-sslv3
        tune.ssl.default-dh-param 2048

defaults
        log     global
        timeout connect 5000
        timeout client  50000
        timeout server  50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http


frontend vs_172.16.0.44_443
        bind 172.16.0.44:443 ssl crt /opt/virtual-service-chain.pem
        default_backend pool_test2waySSL


backend pool_test2waySSL
        server testweb01 172.16.0.25:443 ssl verify required ca-file /opt/rootCA.crt crt /opt/ha-client2.pem
</pre>
</li>
<li><strong>Success!!</strong><br />
<a href="https://techjockey.net/wp-content/uploads/HAProxy-Success.png"><img loading="lazy" class="alignnone wp-image-3304" src="https://techjockey.net/wp-content/uploads/HAProxy-Success-300x139.png" alt="" width="600" height="278" srcset="https://techjockey.net/wp-content/uploads/HAProxy-Success-300x139.png 300w, https://techjockey.net/wp-content/uploads/HAProxy-Success.png 510w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
<li><strong>Revocation test</strong>
<ul>
<li><strong>Revoke and re-generate the rootCRL.crl file</strong>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Revoke">root@ca:/opt# openssl ca -config openssl-rootca.conf -revoke ha-client2.crt -crl_reason keyCompromise
Using configuration from openssl-rootca.conf
Enter pass phrase for /opt/rootCA.key:
Revoking Certificate 1007.
Data Base Updated
</pre>
<p><strong>And re-generate the CRL</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="re-generate CRL">root@ca:/opt# openssl ca -config openssl-rootca.conf -gencrl -out rootCRL.crl
Using configuration from openssl-rootca.conf
Enter pass phrase for /opt/rootCA.key:
</pre>
</li>
<li><strong>Reload Apache on our web-server to pick up the new CRL file</strong>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" title="Restart Apache2">root@web-server:/opt# service apache2 restart</pre>
</li>
<li><strong>Now we test&#8230;.</strong><br />
<a href="https://techjockey.net/wp-content/uploads/haproxy-revoke.png"><img loading="lazy" class="alignnone wp-image-3305" src="https://techjockey.net/wp-content/uploads/haproxy-revoke-300x191.png" alt="" width="600" height="383" srcset="https://techjockey.net/wp-content/uploads/haproxy-revoke-300x191.png 300w, https://techjockey.net/wp-content/uploads/haproxy-revoke-768x490.png 768w, https://techjockey.net/wp-content/uploads/haproxy-revoke.png 785w" sizes="(max-width: 600px) 100vw, 600px" /></a></li>
</ul>
</li>
</ol>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techjockey.net/masking-2-way-mutual-ssl-authentication-using-f5-ltm-or-haproxy/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
