diff --git a/kmip/services/server/engine.py b/kmip/services/server/engine.py
index c90d355..5787b30 100644
--- a/kmip/services/server/engine.py
+++ b/kmip/services/server/engine.py
@@ -249,7 +249,10 @@ class KmipEngine(object):
             )
 
         # Process the authentication credentials
-        auth_credentials = header.authentication.credential
+        if header.authentication:
+            auth_credentials = header.authentication.credential
+        else:
+            auth_credentials = None
         self._verify_credential(auth_credentials, credential)
 
         # Process the batch error continuation option

Install/Run Instructions and SQLAlchemy Issue
I have installed the latest version of pykmip-server (0.5.0) but have some questions.

I noticed that the instructions on the Wiki mention to run the "run_server.py" script but it appears as though the newer versions of pykmip support installation of Pykmip-server using the easy-install/pip method (python server.py build/install).  Is the easy-install/pip the preferred method of installing now?

When I start the server (0.5.0) using the pykmip-server script in /bin, I am receiving the following message:

/usr/lib/python3.4/site-packages/SQLAlchemy-1.1.0b3-py3.4-linux-x86_64.egg/sqlalchemy/orm/mapper.py:1034: SAWarning: Reassigning polymorphic association for identity 'Certificate' from <Mapper at 0x7f2fa55a99b0; Certificate> to <Mapper at 0x7f2fa55a9eb8; X509Certificate>: Check for duplicate use of 'Certificate' as value for polymorphic_identity

I have generated certs and they are signed by a CA.  I even tried using the demo certs that were included.  It appears as though the server still runs with after this message is displayed but wasn't sure if it is a warning or is causing other issues.  I confirmed that I am binding to port 5696 on a public interface and enabled logging.  I'm not currently able to connect from my client.

The message I receive in the log when a client attempts to connect is:

2016-09-21 16:08:35,948 - kmip.server.session.00000001 - WARNING - An unexpected error occurred while processing request.
2016-09-21 16:08:35,948 - kmip.server.session.00000001 - ERROR - 'NoneType' object has no attribute 'credential'
Traceback (most recent call last):
  File "/usr/lib/python3.4/site-packages/PyKMIP-0.5.0-py3.4.egg/kmip/services/server/session.py", line 106, in _handle_message_loop
    request
  File "/usr/lib/python3.4/site-packages/PyKMIP-0.5.0-py3.4.egg/kmip/services/server/engine.py", line 142, in decorator
    return function(self, *args, **kwargs)
  File "/usr/lib/python3.4/site-packages/PyKMIP-0.5.0-py3.4.egg/kmip/services/server/engine.py", line 252, in process_request
    auth_credentials = header.authentication.credential
AttributeError: 'NoneType' object has no attribute 'credential'

Last question.  I tried going back to a previous version of PyKmip (such as 0.4.1) since this is prior to using sqlalchemy.  When I install this, there is no pykmip-server in /bin and I see no run_server.py.  I tried running the kmip/services/server/server.py script but it runs and then exits right away.  What is the preferred way to run in version 0.4.1?

Sorry for all of the questions and thanks for your hard work.  I would greatly appreciate any help you can provide.

diff --git a/kmip/tests/unit/services/server/test_engine.py b/kmip/tests/unit/services/server/test_engine.py
index f969557..d13a893 100644
--- a/kmip/tests/unit/services/server/test_engine.py
+++ b/kmip/tests/unit/services/server/test_engine.py
@@ -391,6 +391,41 @@ class TestKmipEngine(testtools.TestCase):
             *args
         )
 
+    def test_process_request_missing_credential(self):
+        """
+        Test that the engine does not immediately error out when retrieving
+        a non-existent credential from the request.
+        """
+        e = engine.KmipEngine()
+        e._logger = mock.MagicMock()
+
+        protocol = contents.ProtocolVersion.create(1, 1)
+        header = messages.RequestHeader(
+            protocol_version=protocol,
+            authentication=None,
+            batch_error_cont_option=contents.BatchErrorContinuationOption(
+                enums.BatchErrorContinuationOption.STOP
+            ),
+            batch_order_option=contents.BatchOrderOption(True),
+            time_stamp=contents.TimeStamp(int(time.time())),
+            batch_count=contents.BatchCount(1)
+        )
+        payload = discover_versions.DiscoverVersionsRequestPayload()
+        batch = list([
+            messages.RequestBatchItem(
+                operation=contents.Operation(
+                    enums.Operation.DISCOVER_VERSIONS
+                ),
+                request_payload=payload
+            )
+        ])
+        request = messages.RequestMessage(
+            request_header=header,
+            batch_items=batch
+        )
+
+        e.process_request(request)
+
     def test_build_error_response(self):
         """
         Test that a bare bones response containing a single error result can

pip install -e .
parse_log_pytest
requirements.txt
coverage pytest flake8 testtools fixtures testresources mock testscenarios testrepository sphinx bandit
apt-get update apt-get install -y gcc pip install tox bandit codecov coveralls
3.4
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
attrs==22.2.0
Babel==2.11.0
bandit==1.7.1
certifi==2021.5.30
cffi==1.15.1
charset-normalizer==2.0.12
codecov==2.1.13
coverage==6.2
coveralls==3.3.1
cryptography==40.0.2
distlib==0.3.9
docopt==0.6.2
docutils==0.17.1
enum34==1.1.10
extras==1.0.0
filelock==3.4.1
fixtures==4.0.0
flake8==5.0.4
gitdb==4.0.9
GitPython==3.1.18
greenlet==2.0.2
idna==3.10
imagesize==1.4.1
importlib-metadata==4.8.3
importlib-resources==5.4.0
iniconfig==1.1.1
iso8601==1.1.0
Jinja2==3.0.3
MarkupSafe==2.0.1
mccabe==0.7.0
mock==5.2.0
packaging==21.3
pbr==6.1.1
platformdirs==2.4.0
pluggy==1.0.0
py==1.11.0
pycodestyle==2.9.1
pycparser==2.21
pyflakes==2.5.0
Pygments==2.14.0
-e git+https://github.com/OpenKMIP/PyKMIP.git@40919468a64046349191c946991e0415fe768a0b#egg=PyKMIP
pyparsing==3.1.4
pytest==7.0.1
python-subunit==1.4.2
pytz==2025.2
PyYAML==6.0.1
requests==2.27.1
six==1.17.0
smmap==5.0.0
snowballstemmer==2.2.0
Sphinx==4.3.2
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
SQLAlchemy==1.4.54
stevedore==3.5.2
testrepository==0.0.21
testresources==2.0.1
testscenarios==0.5.0
testtools==2.6.0
toml==0.10.2
tomli==1.2.3
tox==3.28.0
typing_extensions==4.1.1
urllib3==1.26.20
virtualenv==20.17.1
zipp==3.6.0

name: PyKMIP
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - attrs==22.2.0
      - babel==2.11.0
      - bandit==1.7.1
      - cffi==1.15.1
      - charset-normalizer==2.0.12
      - codecov==2.1.13
      - coverage==6.2
      - coveralls==3.3.1
      - cryptography==40.0.2
      - distlib==0.3.9
      - docopt==0.6.2
      - docutils==0.17.1
      - enum34==1.1.10
      - extras==1.0.0
      - filelock==3.4.1
      - fixtures==4.0.0
      - flake8==5.0.4
      - gitdb==4.0.9
      - gitpython==3.1.18
      - greenlet==2.0.2
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==4.8.3
      - importlib-resources==5.4.0
      - iniconfig==1.1.1
      - iso8601==1.1.0
      - jinja2==3.0.3
      - markupsafe==2.0.1
      - mccabe==0.7.0
      - mock==5.2.0
      - packaging==21.3
      - pbr==6.1.1
      - platformdirs==2.4.0
      - pluggy==1.0.0
      - py==1.11.0
      - pycodestyle==2.9.1
      - pycparser==2.21
      - pyflakes==2.5.0
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - python-subunit==1.4.2
      - pytz==2025.2
      - pyyaml==6.0.1
      - requests==2.27.1
      - six==1.17.0
      - smmap==5.0.0
      - snowballstemmer==2.2.0
      - sphinx==4.3.2
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - sqlalchemy==1.4.54
      - stevedore==3.5.2
      - testrepository==0.0.21
      - testresources==2.0.1
      - testscenarios==0.5.0
      - testtools==2.6.0
      - toml==0.10.2
      - tomli==1.2.3
      - tox==3.28.0
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - virtualenv==20.17.1
      - zipp==3.6.0
prefix: /opt/conda/envs/PyKMIP

kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request_missing_credential
kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_destroy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_object_type kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_object_type_unsupported_type kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_with_key_format_type
kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_build_core_object kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_build_core_object_unsupported_type kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_build_error_response kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_get_destroy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_key_pair kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_key_pair_get_destroy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_key_pair_mismatched_attributes kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_key_pair_omitting_attributes kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_omitting_attributes kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_unsupported_object_type kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_discover_versions kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_object_type_missing_object kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_object_type_multiple_objects kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_with_unsupported_features kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_init kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_batch kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_batch_expected_error kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_batch_missing_batch_id kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_batch_unexpected_error kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_multibatch kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request_future_timestamp kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request_stale_timestamp kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request_unsupported_async_indicator kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request_unsupported_batch_option kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request_unsupported_version kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_template_attribute kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_template_attribute_unsupported_features kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_query kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_register kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_register_get_destroy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_register_unsupported_object_type kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_request_omitting_secret kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_set_attribute_on_managed_object kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_set_attribute_on_managed_object_unsupported_features kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_set_attributes_on_managed_object kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_set_attributes_on_managed_object_attribute_mismatch kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_supported_operation kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_unsupported_operation kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_version_operation_match kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_version_operation_mismatch
kmip/services/server/engine.py
kmip/services/server/engine.py